【问题标题】:Remove repeated elements from a list in O(n log n) time在 O(n log n) 时间内从列表中删除重复的元素
【发布时间】:2014-11-25 10:48:52
【问题描述】:

我需要一个 O(n log n) 算法来从列表中删除重复的元素。例如,我知道我可以使用一个集合,但我需要一个具有这种特定复杂性的算法,但我不知道如何对其进行编码。由于我现在有了这段代码,但我不知道它的复杂性是什么,尽管我相信它不是 n log n。

def removing(a):

for e in a:
    if e in a[a.index(e)+1:]:
        a.remove(e)

return a

练习说它需要一个 O(n*log(n)) 算法,并没有说明之前对列表进行排序。

【问题讨论】:

  • 在下面的其中一个 cmets 中,您提到“是的,我知道我可以使用 list(set(a)),但是练习说的是它需要一个 n*log n 算法,并且没有说之前对列表进行排序”。在这里不鼓励期待家庭作业问题的答案。但是提示 - log N 需要分而治之的方法。使用快速排序中的分区。
  • 如果你不知道它有多复杂,我建议你尝试一下。给它一个包含 10 个成员、100 个成员、1000 个成员、10000 个成员的“a”列表。绘制计算它所需的时间 (docs.python.org/2/library/timeit.html) 与元素数量的关系图,看看它是否具有正确的形状 (stackoverflow.com/questions/7830727/n-log-n-is-on)
  • 这是一个很长的练习列表中的一个小问题。我被卡住了,可能是因为我不太了解复杂性是如何工作的。谢谢你的回答

标签: python algorithm list


【解决方案1】:

由于这是一个作业,我只是提示您 - 您可以使用 set 解决方案,并通过使用 OrderedDict 而不是常规 set 来获得 O(nlogn) 最坏情况下的性能(键的映射不没关系,您可以将它们全部映射到None,或其他任意值)

如果结果列表中元素的顺序无关紧要,最简单的解决方案是仅排序,然后迭代,并排除 a[i] == a[i+1] 这样的元素。结果将是一个包含所有唯一元素的排序列表,并在 O(nlogn)

中完成

祝你好运。

【讨论】:

  • 我认为OP不想使用内置
  • 他没有这么说,所以我们可以假设没关系
  • 是的,想法是不使用内置函数,如果可能,不要对列表进行排序。
  • [ a[i] for i in range(len(a)-1) if a[i] not in a[i+1:] ] 的时间复杂度是多少??
  • @Hackaholic O(n^2).
【解决方案2】:
x=[1,2,3,4,6,6,2,3,1]

dic={}
for i in x:
    dic[i]=0

print dic.keys()

你可以试试这个。

【讨论】:

  • (1) 您应该避免对家庭作业问题给出完整的“即用型”答案。 (预计 10k+ 代表用户会意识到这一点)(2)它不满足最坏情况性能的复杂性要求。 OP在问题本身中明确给出了这个解决方案,并表示它不符合要求。
  • @amit OP 的解决方案不一样。这也在nlogn 之内。
  • @amit meta.stackexchange.com/questions/10811/… - '不要对真诚回答家庭作业问题的人投反对票,即使他们违反了这些准则'
  • @MrBones 我因为 (1) 和 (2) 而投了反对票,而 (2) 本身就值得投反对票,因为这显然不是 OP 想要的 - 因为他 在问题本身中明确说明了这个确切的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多