我使用C#,我有三个List<int>
(比如大小n和不同的元素)。我的目标是找到所有三个元素。所以我可以迭代第一个并检查项目是否在另外两个。那将是O(n ^ 2)。我可以先对其他两个列表进行排序,然后使用二进制搜索检查其中的项目。那将是O(nlogn)(没有排序)。
或者我可以构造两个词典Dictionary<int, byte>
,其中键将是我的列表的项目,然后检查项目将是O(1)和总O(n)。但是构建字典的价格怎么样?任何人都能说出这需要多少费用?
也许还有更高效的算法?
答案 0 :(得分:4)
使用HashSet
非常简单,我认为这是您表现最好的选择。
HashSet<T> hset = new HashSet<T>(list1);
hset.IntersectWith(list2);
hset.IntersectWith(list3);
return hset.ToList(); // skip the ToList() if you don't explicitly need a List
答案 1 :(得分:1)
您只能使用一个Dictionary<int, byte>
,其中byte
的值可以是1或2.对于第一个列表,您只需执行值等于1的插入,对于第二个列表,您执行{{1并且基于结果执行插入或更新,其值等于2.对于第三个列表,检查值是否为2.