我有一个像这样的匹配器:
type matcher struct {
all []int
none []int
any [][]int
}
对于要匹配的整数数组,它必须包含all
中的所有整数,none
中没有整数,并且必须包含any
中每个整数数组中的至少一个整数{1}}。我有一个工厂,可以很容易地构建这样的匹配器,但是一旦我拥有工厂区域,我就需要“压扁”结构,以确保没有任何条款是矛盾的。现在,我所拥有的是(伪代码):
all = [0, 1, 2, 3] // means all of these numbers must be present for the matcher to match
any = [[4, 5], [6, 7, 8]] // means one number from each of these groups must be present
none = [9,10] // means none of these may be present
sort(all)
sort(none)
if len(intersections(all, none)) != 0 {
panic("All and none are contradictory!")
}
for gIndex, group in any {
sort(group)
for index, integer in group {
// If all contains the integer...
if binarySearch(all, integer) {
swap(group[len(group)-1], group[index]) // swap the last item with the integer...
group = group[:len(all)-1] // and truncate the group by one; most efficient way to delete an item.
}
// If none contains the integer...
if binarySearch(none, integer) {
panic("item in any is also found in none; possible contradiction")
}
}
if len(group) < 1 {
// delete group from any
} else if len(group) == 1 {
// put group[0] (only integer in it) into all, since it must be met
} else {
sort(group) // Re-sort the group
any[gIndex] = group // Update the group
}
}
removeDuplicates(all)
removeDuplicates(none)
sort2D(any) // Sort by their greatest member
removeDuplicates2D(any) // Go through and remove any duplicate arrays.
all,any和none现在应该简化为最简单的形式,以便检查整数数组是否匹配应该更有效率且没有矛盾。
有没有更好的方法来做到这一点,我在这里错过了什么?
答案 0 :(得分:1)
您的解决方案至少存在两个缺陷。
您要从all
群组中移除any
中的整数。实际上,如果与all
存在交集,则必须删除整个组而不是删除项目。包含any
项目的all
组只是多余的。
与none
组重叠不一定是个问题。事实上,这些项目可以从any
组中删除。但是,当这导致空any
组时,您可能想要抛出错误。具有空any
组的匹配器无法匹配任何内容。无论如何,不要悄悄地删除空any
组!
类似的内容适用于包含其他any
群组的any
群组。考虑任何选择:
any = [[4, 5], [4, 5, 6]]
我们假设all
和none
为空。然后,您的算法将保持不变。但是,第二组显然是多余的。包含第一组中至少一个元素的任何数组也将与第二组匹配。
这意味着至少你必须删除包含其他超集的所有any
数组。
我确信这会导致您可以用来比较匹配器的规范形式。但是,我可能错了。