【问题标题】:Find common elements in two Integer List查找两个整数列表中的共同元素
【发布时间】:2014-02-01 16:10:04
【问题描述】:

我有两个给定的integer 列表:

alist  : TList<Integer>;   //  eg.   1,2,3,4,5,6,7,8,9
blist  : TList<Integer>;   //  e.g   1,2,3,4,5

Resultlist  : TList<Integer>;     

IgnoreList : TList<Integer>;   //  e,g,  1,2,3

在两个列表中找到共同元素的有效方法是什么,排除忽略列表中的元素。由于我必须对许多项目运行此过程,因此我需要一种有效且快速的实施方式来解决此问题。

Resultlist  should be 4,5 

【问题讨论】:

  • 在您的示例中,列表已排序。在现实生活中,你的列表会一直排序吗?如果是这样,实现就容易多了。
  • 您可以将您的列表转换为 HashSet 并找到一个交集
  • 列表没有排序,Hashset是什么?
  • 你有可能值的下限和上限吗?
  • 如果列表很短,那么直线比较所有与所有是最快的。

标签: list delphi integer


【解决方案1】:

我同意德米特里的观点。无论列表是否排序,将列表转换为哈希集并在其中查找都会很快。

看看 Delphi 的 TDictionary。 TDictionary 交集是查找共同元素的一种快速方法。否则,

1) 为列入黑名单的元素创建一个 TDictionary。 2) 创建一个 TDictionary 并从 alist 中插入不存在于 blacklist-dictionary 中的元素。此操作很快,因为 TDictionary 针对查找进行了优化。 3) 最后,遍历 blist 的元素,只输出 alist-dictionary 中的元素。

【讨论】:

    【解决方案2】:

    你想要的是list comparison algorithm。您获取两个排序列表(如果尚未排序,请确保首先对其进行排序)和两个索引变量,将两个索引都设置为 0,然后开始比较值,如果它们不相等,则推进一个索引或另一个,或两者兼而有之他们的指数是。通过在发现不相等或相等的值时自定义算法的行为,您可以做很多事情。你想要的是,当找到相等的值时,将值插入到输出列表中。

    【讨论】:

    • 这个问题不就是个骗子吗?排序很差。问题是 O(n)
    • @DavidHeffernan:如果列表已排序,问题只是 O(n);否则为 O(N^2)。由于排序是 O(n log n),这是最好的方法。
    • O(N) 表示未排序。使用字典。
    猜你喜欢
    • 2021-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多