从另一个列表中查找列表中排名最高的项目

时间:2016-12-31 22:29:50

标签: c# algorithm

我有一个已按最高等级排序的商品列表,我存储在变量 topList 中。

然后我有我存储在变量 currentList

中的当前项目列表

目标是找到topList中排名最高的currentList元素。

section

我的方法ReturnTop太慢,它是O(n²)。我们可以做得更好吗?

3 个答案:

答案 0 :(得分:2)

您当前的实现是O(N * T),其中N是查询列表中的项目数,T是顶部列表中的项目数;使用空间是O(1)。

如果你不介意将空间的使用增加到O(N),你可以通过从查询字构造一个哈希集,并在{{1}中搜索第一个单词,在O(N + T)中实现一个算法。匹配一个查询词,如下所示:

topList

构造var knownWords = new HashSet<string>(currentList); return topList.FirstOrDefault(w => knownWords.Contains(w)); 需要O(N)时间和O(N)空间。在knownWords中搜索topList中存在的最早项目需要O(T)时间和O(1)空间,因为哈希集查找为O(1)。

这可以进一步缩短(谢谢,Slai!)

knownWords

答案 1 :(得分:0)

var topList = new List<string>() {"AB", "DC", "ZG"}; // ordered by highest rank
var currentList = new List<string> {"ZG", "DC"};

var bestItem = currentList.OrderBy(item => topList.FindIndex(a => a == item)).FirstOrDefault();

Console.WriteLine(bestItem);

http://csharppad.com/gist/b6f3b41afb86018c6f81284cc4ae22b5

答案 2 :(得分:0)

使用下面的解决方案搜索顶部项目将采用O(N + M)(其中N是topList项目的数量,M是当前列表的数量),可以计为O(2N)

创建字典时,它会循环echo "Hello {$username} Welcome back";的所有项目 并且将循环使用topList的所有项目以搜索具有最小索引的项目。

current