python - 有效查找重复项对的数量

标签 python algorithm performance iteration big-o

我正在尝试找到一种返回列表中重复项对数量的算法。

示例: 输入:[13,4,8,4,13,7,13,9,13] 输出:7 (4 个 13 组成 6 对,两个 4 组成 1 对)

我的算法可以变得更高效吗?我希望它比 Theta(n^2) 更快

这是我所拥有的:

my_List=[13,3,8,3,13,7,13,9,13]

pairs=0
alreadySeen=[]

for element in my_List:
  howMany=0
  if element in alreadySeen:
    False
   else:
    howMany=my_List.count(element)
    pairs=pairs+((howMany*(howMany-1))/2)
    howMany=0
    alreadySeen.append(element)

print(pairs)

最佳答案

这是一个运行时间复杂度为 O(N) 的算法。

  1. 迭代元素一次以创建每个元素及其计数的字典。 对于您的示例,此步骤的输出为 {13: 4, 4:2, 8:1, ...}
  2. 迭代该字典并计算每个元素的对数。每个元素的对数可以被认为是从 N 个元素的列表中选择 2 个项目。这可以通过计算 combinations 来完成使用公式 (N * (N-1))/2 无需重复。因此,对于 4 个元素,有 (4 * 3)/2 = 6 对。

关于python - 有效查找重复项对的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41994465/

相关文章:

python - 敌人跟随中间的玩家

python - 动态规划 - 节省计算时间

python - 编写 Python shell 脚本时使用 subprocess.call() 或 os.system() 不好吗?

algorithm - 游戏求解算法(Buttonia,熄灯变体)

c# - JIT 编译器是否优化(内联)不必要的变量声明?

performance - Sakai 10(与 Sakai 2.9 相比)有哪些技术改进(而非功能)?

python - 为什么当元素存在时, Selenium 会超时

c - Garwick 处理堆栈溢出的算法?

java - 将数据从复杂的 HTML 表中提取到 Java 中的二维数组

javascript - 从 sockjs-node 广播的有效方法?