Optimization 是否有一种算法可以识别一组不同于一个数字的数字?

Optimization 是否有一种算法可以识别一组不同于一个数字的数字?,optimization,language-agnostic,Optimization,Language Agnostic,在一组大小为n的六位数字中,是否有一种算法可以识别该集合中相差一位的数字,而无需直接将每个元素与其他元素进行比较?有可能在不到O(n!)的时间内完成这项工作吗 例如,在以下一组数字中: 789000 889000 543200 125894 156795 146795 789000和889000相差一位数。156795和146795也相差一位。这些数字需要通过算法识别。简单的解决方案是渐近最优的: def元素相隔一个(集合): 结果=集合()#创建一个新集合 对于_集合中的x: 对于数字中的y,

在一组大小为n的六位数字中,是否有一种算法可以识别该集合中相差一位的数字,而无需直接将每个元素与其他元素进行比较?有可能在不到O(n!)的时间内完成这项工作吗

例如,在以下一组数字中:

789000 889000 543200 125894 156795 146795


789000和889000相差一位数。156795和146795也相差一位。这些数字需要通过算法识别。

简单的解决方案是渐近最优的:

def元素相隔一个(集合):
结果=集合()#创建一个新集合
对于_集合中的x:
对于数字中的y,与x不同的是一位数字(x):
如果y在_集合中:
结果。添加(x)
break#跳到下一个x值
返回结果
外循环迭代\u集合的n个元素,内循环迭代最多6*9=54个
y
。所以内部循环的迭代次数是O(n)

如果您使用了一个中的
添加
操作,则每个操作都需要O(1)个时间。所以总的时间复杂度是O(n)。如果输入不是散列集,则可以在O(n)时间内将其转换为散列集,因此算法仍然是O(n)


没有一个解决方案可能比O(n)时间快,因为任何较低的复杂性都不足以查看集合中的所有数字。为什么会是O(n!)?我想您需要将每个数字与后续的每个数字进行比较。我没有想到用你的方式来框定它。比较所有数对的解决方案是O(n^2),而不是n阶乘-如果你迭代整个序列的所有置换,就会出现n阶乘。绝对!我认为在这种情况下没有必要这样做。例如,在集合55 67 52 54中,一旦您将55与接下来的3个元素进行了比较,就无需再次将67与55进行比较。谢谢!我的书呆子坚持要我注意到,内部循环将需要对y的59个值进行迭代,因为除了最左边的数字外,0在所有数字中都是可能的。@MasterArcanist正确的数字是53,原因是0-而不是59,因为只有9(而不是10)个选项来替换6个数字中的每一个。第十个选项将使数字
x
保持不变。