给定4个对象,如何确定2是否具有某个属性

时间:2010-03-31 16:10:23

标签: objective-c algorithm

我还有另外一个问题,如何为这个问题做出最优雅的解决方案,因为我没有能力去电脑学校,所以我的实际“纯编程”CS知识并不完美或很好。这基本上是一个算法问题(有人请你纠正我,如果我使用那个错误,因为我不想继续说他们并且自己尴尬)

我有4个物体。他们每个人都有一个物种属性,可以是狗,猫,猪或猴子。因此,样本情况可能是:

object1.species =猪 object2.species =猫 object3.species =猪 object4.species =狗

现在,如果我想弄清楚所有4种是同一物种,我知道我可以说:

if  ( (object1.species==object2.species) 
    && (object2.species==object3.species)
    && (object3.species==object4.species)
) {
    // They are all the same animal (don't care WHICH animal they are)
}

但那不是那么优雅吧?如果我突然想知道它们中的3个或2个是否是同一物种(虽然不关心它们的种类),突然之间我就是意大利面条代码。

我正在使用Objective C虽然我不知道这是否真的很重要,因为最优雅的解决方案是我在概念上假设所有语言都一样吗?任何人都有好主意?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以在物种上使用哈希表(或物镜-C中的词典),每次都增加计数。

为清楚起见(伪代码):

// N is 4 for your particular case
for ( int i = 0; i < N; i++ )
   hashtable[ object[i].species ]++;

hashtable[ Species.PIG ]; // number of pigs (constant)

或者如果您想手动展开它:

hashtable[ object1.species ]++;
hashtable[ object2.species ]++;
hashtable[ object3.species ]++;
hashtable[ object4.species ]++;

现在您可以通过物种查看计数:

for each key in hashtable
    if ( hashtable[ key ] == 3 ) // species "key" has 3 items
        /* Code */

当然,如果物种只是一个简单的枚举/整数,“哈希表”可以只是一个简单的数组。在任何一种情况下,上述都应该是相同的理论。

答案 1 :(得分:1)

您可以计算所有可能比较的比较数量。如果恰好1个比较为真,则恰好2个项目相同,如果3个比较匹配,则恰好3个项目相同。这个例子在C中,你必须自己将它转换为objective-C。

int count = 0;
count += object1.species == object2.species;
count += object1.species == object3.species;
count += object1.species == object4.species;
count += object2.species == object2.species;
count += object2.species == object3.species;
count += object3.species == object4.species;
// count 0 - all different
// count 1 - exactly 2 are the same
// count 2 - two pairs of 2
// count 3 - exactly 3 are the same
// count 6 - all are the same

计数也可以实现为循环:

for (int i = 0; i < 4; i++)
    for (int j = i + 1; j < 4; j++)
        count += objects[i].species == objects[j].species;

此方法仅在对象数量为5或更少时才有效。由于这一点以及比较量按比例缩放的事实,如果对象的数量较大,最好使用哈希表。

答案 2 :(得分:1)

这正是集合和计数集的用途。

BOOL allSameSpecies(NSArray *animals) {
    NSSet *speciesSet = [NSSet setWithArray:[animals valueForKey:@"species"]];
    return [[speciesSet] count] == 1;
}

BOOL sameSpeciesNumber(NSArray *animals, NSUInteger targetCount) {
    NSCountedSet *speciesCounts = [NSCountedSet setWithArray:[animals valueForKey:@"species"]];
    for (id species in speciesCounts) {
        if ([speciesCounts countForObject:species] == targetCount)
            return YES;
    }
    return NO.
}