问题:农场里有很多动物。每个动物都可以有任意数量的动物朋友,除了反社会动物——它们没有属于它们的朋友,但它们作为朋友属于其他正常动物。每只动物都和它最不快乐的动物朋友一样快乐,当然反社会动物除外。反社会动物的幸福水平可以是任何东西。
一天早上,所有动物醒来,发现一些反社会动物的情绪发生了变化。农夫如何算出每只动物的幸福感?
就农场工人而言(他们没有上过农民学校):
DataTable animals = Select_All_Animals();
foreach (DataRow animal in animals.Rows)
{
int worstMood = 10; //Super Happy!
DataTable friendRecords = Select_Comp_Animal_AnimalFriend((int)animal["AnimalID"]);
foreach (DataRow friend in friendRecords.Rows)
{
DataTable animalFriends = Select_AnimalFriend((int)friend["AnimalID_Friend"]);
foreach (DataRow animalFriend in animalFriends.Rows)
{
int animalMood = Get_Animal_Mood((int)animalFriend["Mood"]);
if (animalMood < worstMood)
{
worstMood = animalMood;
}
}
}
}
但这是行不通的,因为动物表没有按顺序遵循已形成的动物朋友层次结构。动物可以随时交朋友!所以 Animal(1) 可能有 Animal(4000) 作为朋友。Animal(1) 不会显示准确的情绪,因为它会在 Animal(4000) 的情绪自行更新之前检查 Animal(4000) 的情绪。每天都有新的动物被丢弃。我认为解决方案可能是一种常见的算法设计,但我一直无法找到它。我不相信我有正确的术语来准确搜索它。
非常感谢,很抱歉,如果这已经得到回答!
添加:
这是可能的关系的 ghetto Paint 图表:
反社会动物处于最底层,没有属于它们的朋友。正常的动物在上面的任何地方。正常的动物友谊没有确切的结构,除了(正如塞巴斯蒂安指出的那样)不可能有一个闭环(如果设计正确)。
每周将增加数十万只动物,处理速度是一个关键因素。