如何优化两个有序结构切片之间理想匹配的搜索?

How to optimize search for ideal matches between two ordered slice of structs?

提问人:Gasimoff 提问时间:5/24/2023 更新时间:5/25/2023 访问量:77

问:

我有两个切片:

type MyStruct struct {
  Id int
  field1 int
  field2 int
}

var sliceA []*MyStruct
var sliceB []*MyStruct

我想要的是从两个切片中找到理想的匹配。

可接受的标准是并且可以分别在特定范围内匹配(例如,低范围 10,最高范围 20)。 此外,一个匹配的元素可以与另一个元素匹配(如多对多)。field1field2

我尝试过:

startIndex := 0
lengthOfB := len(sliceB)

leftBorder := 10
rightBorder := 20


for _, a := range sliceA {
  for i := startIndex; i < lengthOfB; i++ {
    if sliceB[i].field1 < a.field1 - leftBorder {
      // if it is less than the minimum limit then for the
      // next element from sliceA I don't need to check it.
      startIndex++

      continue
    }

    if sliceB[i].field1 > a.field1 + rightBorder {
      // if it is greater than the maximum limit then it is
      // time to go to the next element from sliceA. 
      break
    }

    // check other conditions
    if /* matched*/ {
      // add match details into a different slice
      // then continue the loop
    }
  }
}

注意:两个切片,并在循环之前按升序排序。sliceAsliceBfield1

时间复杂度大致,而且太慢了(显然)。O(n*m)

GO 优化 搜索 匹配

评论

0赞 Gasimoff 5/24/2023
所做的是改进内存分配 - 更改了在匹配列表中添加新元素,并且对时间有很好的影响。

答:

0赞 Dave 5/25/2023 #1

循环访问一个切片,然后对另一个切片进行二进制搜索。

for _, a := range sliceA {
    b := binarySearch(sliceB, a.field1)
    if matched(b.field1, a.field1) {
        // Whatever you want to do
    } 
}

这将是 .如果 和 和 的大小不同,则迭代较短的大小。O(n log m)nm

评论

0赞 Gasimoff 5/25/2023
对于一对一匹配,是的,没关系。但对于多对多的人来说,不,不幸的是。
0赞 Dave 5/25/2023
@Gasimoff澄清你的意思。包括示例。
0赞 Gasimoff 5/25/2023
我已经在主要问题中提到过,在“尝试”部分之前
0赞 Dave 5/25/2023
@Gasimoff您的术语不清楚,并且您没有包含任何示例。你的意思是除了 B ~in A 之外,你还想要所有 A ~in B 吗?