序列元素互异性算法
Posted jeffrey-yang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列元素互异性算法相关的知识,希望对你有一定的参考价值。
概念
在Python中,list,tuple等数据类型中的元素可以重复,不同于set类型(set中不存在重复元素)。应此,必然存在相应的算法以检验序列是否存在重复元素。
实现一
def unique1(S):
"""Return True if there are no duplicate elements in sequence S"""
for j in range(len(S)):
for k in range(j + 1, len(S)):
if S[j] == S[k]:
return False # found duplicate pair
return True # if we reach this, elements were unique
实现一的思想很简单,外层循环遍历序列中的每一个值,从左至右。S[0]和S[1]...,...S[n - 1]逐一比较,S[1]和S[2]...,...S[n - 1]逐一比较,直到S[n-2]和S[n-1]比较,则遍历结束。
上述的比较次数为(n - 1) + (n - 2) + …… + 2 + 1。因此,总的时间复杂度为O( $ n^2 $)。
实现二
def unique2(S):
"""Return True if there are no duplicate elements in sequence S"""
temp = sorted(S)
for j in range(1, len(temp)):
if temp[j - 1] == temp[j]:
return False # found duplicate pair
return True # if we reach this, elements were unique
由代码示例可知,首先通过Python内置的排序函数进行排序,默认由小到大排序。排序前若序列中存在相同的元素,则排序后,相同的元素的位置相邻。例如,a = [5, 3, 2, 3, 4],b = sorted(a),则b = [2, 3, 3, 4, 5]。应此,在对序列进行循环遍历时,只需要比较相邻的元素是否相等。若从左到右依次比较,均无相等的元素,则序列中的元素互异。
- 内置函数sorted,生成原始序列排序后的一份拷贝。其最大时间复杂度为O(n$ log $n)。以后讲到排序算法时单独分析其时间复杂度。
- 循环语句中,遍历序列长度为n,则其时间复杂度为O(n)。应此,整个算法的时间复杂度为O(n$ log $n)。
以上是关于序列元素互异性算法的主要内容,如果未能解决你的问题,请参考以下文章