Opa:反转弦乐的最快方法是什么?

时间:2011-10-26 07:04:06

标签: recursion opa

在Opa中实现“反向字符串”功能的最佳方法是什么?

我知道String.reverse()。它确实完成了工作,但它的源代码绑定到一些外部函数。我想了解重新排序字符串的最佳(最快)工具是什么。

因此,例如,这有效,但速度不是很快:

reverse(s:string) =
  p = parser
    | x=(.) xs=(.*) -> Text.concat(reverse(Text.to_string(xs)), x)
    | x=(.*) -> x
  Parser.parse(p, s)

如何让这个表现更好?

编辑:基于akoprowski的答案的另一个实现

我认为这就是他的想法。这个比解析器版本快得多,但如果你需要做的就是反转一个字符串,那么内置的String.reverse就是你的选择。

reverse_list(l:list(string)):list(string) =
  match l with
  | [x|xs] -> reverse_list(xs) ++ [x]
  | _ -> []

reverse_string(s:string) =
  string_list = List.init((i -> String.get(i, s)), String.length(s))
  String.flatten(reverse_list(string_list))

编辑:以上实施不理想

查看已接受的答案以获得更好的选择。

1 个答案:

答案 0 :(得分:1)

为什么不想使用String.reverse? (反转字符串的首选方式)。或者这只是一个练习?

我建议使用List.init生成字符列表,String.get(获取字符串的第n个字符)和String.flatten将字符列表转换回一个字符串。

这应该比基于解析的方法更快,顺便说一句。具有二次复杂性,所以难怪它很慢。

修改:我想到的解决方案:

reverse_string(s:string) =
  n = String.length(s)
  rev_list = List.init((i -> String.get(n - i - 1, s)), n)
  String.flatten(rev_list)