在Ruby中修改大字符串的最快方法是什么?

时间:2015-08-27 16:33:47

标签: ruby algorithm geolocation wkt

我需要修改ruby中的字符串。具体来说,我正试图从WKT字符串中删除“洞”。孔被定义为第一个括号内的任何一组括号。例如在这个字符串中...... POLYGON ((1 2, 3 4), (5 6, 7 8))

我需要删除, (5 6, 7 8),因为这个括号数据是一个洞,逗号和空格不属于除了单独的括号组之外。

我正在避免使用像matchscan这样的ruby方法来尝试优化速度并实现O(n)速度。

这是我到目前为止所拥有的。

def remove_holes_from(wkt)
    output_string = ""
    last_3_chars  = [ nil, nil, nil ]
    number_chars  = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]

    should_delete_chars = false

    wkt.each_char do |char|
      last_3_chars.shift
      last_3_chars.push(char)
      if should_delete_chars == false
        if number_chars.include?(last_3_chars[0]) && last_3_chars[1] == ")" && last_3_chars[2] == ","
          should_delete_chars = true
          next
        else
          output_string += char
        end
      end

      if should_delete_chars == true
        if number_chars.include?(last_3_chars[0]) && last_3_chars[1] == ")" && last_3_chars[2] == ")"
          should_delete_chars = false
          output_string += char
        else
          next
        end
      end
    end
    output_string
  end

我面临的问题是,对于大型多边形,如美国(超过500,000个字符和超过40,000个点),我需要66秒才能完成此操作。您可以在此处找到字符串:https://gist.github.com/cheeseandpepper/9da5ca6ade921da2b4ab

有人能想到我可以使用的这个例子的优化吗?或者可能采取单独的方法?感谢。

1 个答案:

答案 0 :(得分:2)

Whelp ...正则表达式赢了!

wkt.gsub(/, \(-?\d.*?\)/, "")

花了我0.003742秒

至于正则表达式

,文字逗号

文字空间

\(文字左括号

-?可选的否定号

\d任何数字(因为前一个是可选的,我们需要确保我们有一个数字与另一个开括号)

.*任意数量的任何字符(将是数字,逗号和负号)

?\)最多并包括一个文字的右括号