如何获取使用数组的任意两个值调用的函数的所有可能值?

时间:2010-08-13 07:51:39

标签: c# arrays comparison unique

考虑以下代码:

class MyClass {
    string PropertyA;
    int PropertyB;
    double PropertyC;
    object PropertyD;
    static ComparisonResult Compare(MyClass a, MyClass b){
        // returns a ComparisonResult with
        // _sampleElement = a
        // _commonProperties = flags that describe the common properties of a and b
    }
}

enum SimilarityFlags {
    SharedPropertyA = 1,
    SharedPropertyB = 2,
    SharedPropertyC = 4,
    SharedPropertyD = 8
}

class ComparisonResult {
    private MyClass _sampleElement;
    private SimilarityFlags _commonProperties;

    bool Equals(object obj){
        ComparisonResult other = obj as ComparisonResult;
        if(other==null) return false;
        if(this._commonProperties != other._commonProperties) return false;
        MyClass s1 = this._sampleElement;
        MyClass s2 = other._sampleElement;
        if(_commonProperties.HasFlag(SimilarityFlags.SharedPropertyA) && s1.PropertyA != s2.PropertyA) return false; 
        if(_commonProperties.HasFlag(SimilarityFlags.SharedPropertyB) && s1.PropertyB != s2.PropertyB) return false; 
        if(_commonProperties.HasFlag(SimilarityFlags.SharedPropertyC) && s1.PropertyC != s2.PropertyC) return false; 
        if(_commonProperties.HasFlag(SimilarityFlags.SharedPropertyD) && s1.PropertyD != s2.PropertyD) return false; 
        return true;
    }

    int GetHashCode(){
        return (int)_commonProperties;
    }
}



MyClass[] array;
HashSet<ComparisonResult> possibleValues = GetAllPossibleComparisonValues(array);

如果在数组中任何两个元素占用时,如何获得Compare返回的所有可能值?

注意:比较(a,b)==比较(b,a)和a!= b

示例(伪代码,3个属性而不是4个):

GetAllPossibleComparisonValues( [  {"foo", 5, 0x00}, {"foo", 77, 0x00}, {"BAR", 5, 0x00}, {"foo", 5, 0x00}, {"BAR", 5, 0x00}  ] )

应该返回此集合:     [{any,any,0x00},{“foo”,any,0x00},{“foo”,5,0x00},{“BAR”,5,0x00},{any,5,0x00}]

GetAllPossibleComparisonValues( [ {"foobar", 1}, {"foobar", 2},  {"foobar", 3},  {"foobar", 4} ])

应该回来     [{“foobar”,any}]

目前,我正在使用此算法:

for(int i = 0; i < array.Length - 1; i++){
    for(int j = i + 1; i < array.Length; j++){
        possibleValues.Add(MyClass.Compare(array[i], array[j]));
    }
}

但效率非常低,特别是对于长数组,其中任何两个元素具有相同的ComparisonResult。 在计算之后,possibleValues.Count通常非常小(1..3),即使对于长数组(2000+元素)也是如此。

我认为可以大大提高计算效率。 例如,如果Compare(array [0],array [1])== Compare(array [0],array [2]),则无需调用Compare(array [1],array [2])

我该怎么办?

1 个答案:

答案 0 :(得分:0)

这个问题好像是boolean satisfiability problem。如果将数组的每个值建模为布尔输入变量,则可以使用维基百科页面中列出的算法来获取满足某个输出变量的所有输入向量。努力并不低,所以这取决于你是否真的需要这种加速,或者你是否可以使用你已经完成的工作解决方案,因为这很容易理解。

另一件事可能是您缓存已经找到的解决方案,并且只修改那些找到的向量,即添加了一个数组中的新值。这样你只需要先找到解决方案向量。如果你可以应用这取决于天气,可能的值经常变化,或者如果它们没有太大的改变。