1 に答える
1
投稿で特定したdp
ように、グローバル変数として持つことが問題です。
毎回割り当てるのCalcEditDistance
は遅すぎます。
考えられる解決策は 2 つあります。
1) go-routine ごとに必要なdp
配列は 1 つだけなので、それを 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
dp を取るように calcEditDist を変更します
func CalcEditDist(A string, B string, dp *[max][max]int) int {
lenA := len(A)
lenB := len(B)
calcEditDistance
2)大規模な O(N^2) dp 配列を必要としないように書き直してください。
この関数を注意深く調べると、上にある行と左にある列にのみアクセスするため、実際に必要なストレージは前の行と前の列だけであり、非常に少ないコストで動的に割り当てることができます。これにより、任意の長さの文字列にもスケーリングされます。
ただし、それには少し注意が必要です。
于 2013-12-04T08:25:29.793 に答える