1
4

1 に答える 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)

calcEditDistance2)大規模な O(N^2) dp 配列を必要としないように書き直してください。

この関数を注意深く調べると、上にある行と左にある列にのみアクセスするため、実際に必要なストレージは前の行と前の列だけであり、非常に少ないコストで動的に割り当てることができます。これにより、任意の長さの文字列にもスケーリングされます。

ただし、それには少し注意が必要です。

于 2013-12-04T08:25:29.793 に答える