减少匹配器的最佳方法

时间:2017-01-25 15:05:21

标签: algorithm sorting pseudocode

我有一个像这样的匹配器:

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现在应该简化为最简单的形式,以便检查整数数组是否匹配应该更有效率且没有矛盾。

有没有更好的方法来做到这一点,我在这里错过了什么?

1 个答案:

答案 0 :(得分:1)

您的解决方案至少存在两个缺陷。

  1. 您要从all群组中移除any中的整数。实际上,如果与all存在交集,则必须删除整个组而不是删除项目。包含any项目的all组只是多余的。

    none组重叠不一定是个问题。事实上,这些项目可以从any组中删除。但是,当这导致空any组时,您可能想要抛出错误。具有空any组的匹配器无法匹配任何内容。无论如何,不​​要悄悄地删除空any组!

  2. 类似的内容适用于包含其他any群组的any群组。考虑任何选择:

    any = [[4, 5], [4, 5, 6]]
    

    我们假设allnone为空。然后,您的算法将保持不变。但是,第二组显然是多余的。包含第一组中至少一个元素的任何数组也将与第二组匹配。 这意味着至少你必须删除包含其他超集的所有any数组。

  3. 我确信这会导致您可以用来比较匹配器的规范形式。但是,我可能错了。