gpt4 book ai didi

string - 使用 zip 查找 Scala 中两个字符串之间的差异

转载 作者:行者123 更新时间:2023-12-04 23:28:46 26 4
gpt4 key购买 nike

这是我的 previous question 的后续行动.

我注意到,如果我操作两个字符串(例如,获取最长的公共(public)前缀,计算两个字符串之间的差异等),我倾向于使用 zip (如 (s1 zip s2)... 中)。

它看起来不错但可能效率低下(与命令式代码相比)。这是正确的吗 ?也许,如果性能确实很重要,我应该使用命令式算法。

现在我试图找出两个字符串是否不同。你会推荐使用 zip去做吧?

最佳答案

使用 (s1,s2).zipped 稍微高效一些比 (s1 zip s2)因为您不需要创建元组;相反,您创建带有两个参数的函数。

更好的效率但不易于使用的是定义您自己的自定义专用字符串文件夹:

abstract class StrFold[@specialized T](var result: T) {
def apply(c1: Char, c2: Char): Unit
def done: Boolean
}
def strfold[@specialized T](s1: String, s2: String)(folder: StrFold[T]): T = {
var i = 0
val L = math.min(s1.length, s2.length)
while (i < L) {
folder(s1.charAt(i), s2.charAt(i))
if (folder.done) return folder.result
i += 1
}
folder.result
}

现在如果你想找到最长公共(public)前缀的长度,你
class LcpFind extends StrFold(0) {
var done = false
def apply(c1: Char, c2: Char) { if (c1 == c2) result += 1 else done = true }
}
def lcp(s1: String, s2: String) = strfold(s1,s2)(new LcpFind)

这是一项相当多的工作——可以说几乎与编写命令式或递归函数式代码来计算 LCP 一样多,而无需使用 fold-with-escape-clause。

但它应该几乎和每次手动编写低级字符串一样快。 (唯一的惩罚应该是每次创建(微小的) LcpFind 对象,如果你真的想要,你可以通过在调用之间将 result 重置为零来重用它,或者你可以修改 StrFoldstrfold 为实现并调用 reset 方法,将输入参数更改为 zero 并具有单独的 result 方法。)

关于string - 使用 zip 查找 Scala 中两个字符串之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8257094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com