提问人:Gasimoff 提问时间:5/24/2023 更新时间:5/25/2023 访问量:77
如何优化两个有序结构切片之间理想匹配的搜索?
How to optimize search for ideal matches between two ordered slice of structs?
问:
我有两个切片:
type MyStruct struct {
Id int
field1 int
field2 int
}
var sliceA []*MyStruct
var sliceB []*MyStruct
我想要的是从两个切片中找到理想的匹配。
可接受的标准是并且可以分别在特定范围内匹配(例如,低范围 10,最高范围 20)。
此外,一个匹配的元素可以与另一个元素匹配(如多对多)。field1
field2
我尝试过:
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
}
}
}
注意:两个切片,并在循环之前按升序排序。sliceA
sliceB
field1
时间复杂度大致,而且太慢了(显然)。O(n*m)
答:
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)
n
m
评论
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 吗?
评论