是否可以不使用排序就创建“获取完全不重复的值”算法? 时间复杂度=> On

问题描述

我想知道没有排序的“获取根本不重复的值”算法。

让我解释一下“获取完全不重复的值”

如果列表值为[1,3,2]

我想得到1、2

我尝试了很多算法。

但是我找不到时间稳定度稳定的算法为O(n)。

我尝试使用字典,队列。

但是,时间复杂度总是不稳定的O(n)

使用字典

li = [1,2,5]
li_dict = dict()
for i in range(len(li)):
    try:
        a = li_dict[li[i]]
        li_dict[li[i]] = False
    except KeyError:
        li_dict[li[i]] = True
for k in li_dict.keys():
    if li_dict[k]:
        print(k,end="")

这可能吗?

如果可能的话,请说明如何使其成为可能。 (无排序)

解决方法

我为您提供了一个硬编码的解决方案。您可以使用Set类型:

li = [1,3,2]
result = set()
seen = set()

for i in li:
    if i in seen:
        result.discard(i)
    else:
        result.add(i)
        seen.add(i)

print(result)

因为python集在引擎盖下使用哈希表技术,查找速度非常快,就像在字典中一样。但是,集合更适合您的问题,因为它们的行为更像列表。 在我的代码示例中,我仅对列表进行一次迭代,并且由于Set成员资格测试接近即时(O(1)),因此我认为这是O(n)的复杂性。

我用两套将我已经看过的物品与我想保留的物品分开。

最可能有更多的pythonic解决方案。这是我第一次尝试推断一段代码的复杂性,但是我相信我的结论是正确的。如果没有,其他人可能会纠正我!