我不知道你的問題的所有細節,但我的直覺是,你可能會在這裏思考的東西。您計劃在此數據結構中存儲多少個對象?如果你有大量的數據存儲在這裏,我建議你使用一個實際的數據庫而不是數據結構。這裏描述的操作類型是關係數據庫擅長的一些經典事例。 MySQL和PostgreSQL是大型關係數據庫的例子,可以在睡眠中做這種事情。如果你想要更輕便的東西SQLite可能會感興趣。
如果你沒有大量的數據需要存儲在這個數據結構中,我建議保持簡單,只有在你確定它不足以滿足你的需求時纔會優化它需要做。作爲第一個鏡頭,我只是推薦使用內置的List接口來存儲你的人員和一個Map來存儲組。你可以做這樣的事情:
// Use a list to keep track of People
List<Person> myPeople = new ArrayList<Person>();
Person steve = new Person("Steve");
myPeople.add(steve);
myPeople.add(new Person("Bob"));
// Use a Map to track Groups
Map<String, List<Person>> groups = new HashMap<String, List<Person>>();
groups.put("Everybody", myPeople);
groups.put("Developers", Arrays.asList(steve));
// Does a group contain everybody?
groups.get("Everybody").containsAll(myPeople); // returns true
groups.get("Developers").containsAll(myPeople); // returns false
這definitly不是最快的選項可用,但如果沒有人的數量龐大,以保持跟蹤,你可能不會注意到任何性能問題。如果您確實有一些特殊情況會導致使用常規列表和地圖的速度不可行,請發佈它們,我們可以根據這些建議提出建議。
編輯:
閱讀您的意見後,看來我通過誤解你的問題在第一次運行。看起來你並不是很喜歡將羣組映射到人羣,而是將人員映射到羣組。你可能想要的更多的是這樣的:
Map<Person, List<String>> associations = new HashMap<Person, List<String>>();
Person steve = new Person("Steve");
Person ed = new Person("Ed");
associations.put(steve, Arrays.asList("Everybody", "Developers"));
associations.put(ed, Arrays.asList("Everybody"));
// This is the tricky part
boolean sharesGroups = checkForSharedGroups(associations, Arrays.asList(steve, ed));
那麼你如何實現checkForSharedGroups方法?在你的情況下,由於圍繞這個數字相當低,我只是嘗試天真的方法,並從那裏去。
public boolean checkForSharedGroups(
Map<Person, List<String>> associations,
List<Person> peopleToCheck){
List<String> groupsThatHaveMembers = new ArrayList<String>();
for(Person p : peopleToCheck){
List<String> groups = associations.get(p);
for(String s : groups){
if(groupsThatHaveMembers.contains(s)){
// We've already seen this group, so we can return
return false;
} else {
groupsThatHaveMembers.add(s);
}
}
}
// If we've made it to this point, nobody shares any groups.
return true;
}
此方法在大型數據集上可能沒有很好的性能,但它很容易理解。因爲它被封裝在自己的方法中,所以如果事實證明你需要更好的性能,它也應該很容易更新。如果你確實需要提高性能,我會看看overriding the equals method of Person,這將使聯想中的查找映射更快。從那裏你也可以看看一個自定義類型,而不是字符串組,也有一個重寫的equals方法。這將大大加快上面使用的包含方法。
我不太關心性能的原因是您提到的數字並不像算法那麼大。因爲此方法一找到兩個匹配組就會返回,在最糟糕的情況下,您將調用ArrayList.contains的次數等於存在的組數。在最好的情況下,它只需要被調用兩次。如果您經常調用checkForSharedGroups,性能可能只會成爲一個問題,在這種情況下,您最好找一種方法來減少調用它,而不是優化方法本身。
是的,OP應該採取更加面向對象的方法來解決這個問題,除非有某種其他原因(教授)以特定方式進行。使用面向對象的方法會使後面的問題變得更容易,例如 - 如果組需要一些額外的屬性,例如主持人,名稱,描述,該怎麼辦? – aglassman
感謝您的建議,我估計最多會有~100人和〜10000人。不會有太多的數據修改。 唯一會被稱爲最多的將是檢查函數,該函數接受人員列表,如果它們都不屬於同一組,則返回true,否則返回false。我想以一種只使用很少內存的方式存儲數據,並且可以非常快速地執行此功能。 – user1181031
我應該提到我將存儲組和其他人的所有信息(他們實際上是類),我只需要這個關係表來快速計算這1個函數。 – user1181031