例如,从“read”到“hear”的汉明距离为2,因为“read [0]!= hear [0]”和“read [3]!= hear [3]”。
起初,我认为我的函数由于输入量太大(8,000+字典),所以需要很长时间,但是几分钟显然太长了。因此,我用Java重写了相同的算法,计算仅花费了0.3秒。
我尝试用Swift的两种不同方式编写此代码:
方式1 - 子字符串
extension String {
subscript (i: Int) -> String {
return self[Range(i ..< i + 1)]
}
}
private func getHammingDistance(w1: String, w2: String) -> Int {
if w1.length != w2.length { return -1 }
var counter = 0
for i in 0 ..< w1.length {
if w1[i] != w2[i] { counter += 1 }
}
return counter
}
结果: 434 秒钟
方法二 - 删除字符
private func getHammingDistance(w1: String, w2: String) -> Int {
if w1.length != w2.length { return -1 }
var counter = 0
var c1 = w1, c2 = w2 // need to mutate
let length = w1.length
for i in 0 ..< length {
if c1.removeFirst() != c2.removeFirst() { counter += 1 }
}
return counter
}
结果: 156秒
Java中相同的事情
结果: 0.3秒
调用位置
var graph: Graph
func connectData() {
let verticies = graph.canvas // canvas is Array<Node>
// Node has key that holds the String
for vertex in 0 ..< verticies.count {
for compare in vertex + 1 ..< verticies.count {
if getHammingDistance(w1: verticies[vertex].key!, w2: verticies[compare].key!) == 1 {
graph.addEdge(source: verticies[vertex], neighbor: verticies[compare])
}
}
}
}
对我来说,156秒仍然过于低效。在Swift中比较字符的绝对最有效方法是什么?是否存在一种计算汉明距离的可能解决方案,其中不涉及比较字符?
编辑
编辑1: 我正在取一个包含4和5个字母的完整字典,并创建一个连接图,其中边表示汉明距离为1。因此,我将8,000多个单词相互比较以生成边缘。
编辑2: 添加方法调用。
getHammingDistance
方法的代码,将有助于其他人更好地理解问题。显然,您已经多次调用了该方法。 - rmaddyO(n^2 / 2)
中。结果是8500 * 4250。 - Logan Jahnke