问问题
183 次
1 回答
1
正如您在帖子中所指出的那样,将其dp
作为全局变量是问题所在。
每次分配它CalcEditDistance
太慢了。
您有两种可能的解决方案。
1)每个go-routine只需要1个dp
数组,所以在for循环循环中分配它并传递一个指向它的指针(不要直接传递数组,因为数组按值传递,这将涉及大量复制!)
for i := 0; i < procs; i++ { //create two goroutines
start := i * chunkSize
end := (i+1)*chunkSize - 1
fmt.Println(start, end) //get slice start and end
wg.Add(1)
go func(slices []string, allnames []string) {
var dp [max][max]int // allocate
for _, slice := range slices {
minDistance = 256
distance := 0
sum := 0
for _, name := range allnames {
distance = calcEditDist(slice, name, &dp) // pass dp pointer here
更改 calcEditDist 以获取 dp
func CalcEditDist(A string, B string, dp *[max][max]int) int {
lenA := len(A)
lenB := len(B)
2)重写你的calcEditDistance
所以它不需要大量的 O(N^2) dp 数组。
如果您仔细研究该函数,它只会访问向上的一行和向左的一列,因此您实际需要的所有存储都是前一行和前一列,您可以以很少的成本动态分配它们。这也可以使其扩展到任何长度的字符串。
不过,这需要仔细考虑!
于 2013-12-04T08:25:29.793 回答