我想编写一个函数,可以测试数字列表是否是有效的Golomb标尺。我知道如何在O(n ^ 2)时间内完成它(使用嵌套for循环),但我正在寻找一种简单且更优化的方法。我试图在python中执行它,我的函数将整数列表作为参数。
Golomb标尺定义为一组:
IFF
(维基百科)
答案 0 :(得分:0)
如果这是3SUM - 很难,那么没有人知道如何做得比二次更好。如果这不是3SUM难,我会感到惊讶,但假设的减少看起来好像是技术性的。
答案 1 :(得分:0)
这是我在 python 中的代码,它检查整数列表是否形成 Golomb 规则:
def is_golomb_ruler(ruler: list[int]) -> bool:
marks_count = len(ruler)
# check if first element is not 0
if ruler[0] != 0:
return False
# check if contains negative values
for item in ruler:
if item < 0:
return False
# check differences table
tab_diff = []
for i in range(marks_count - 1):
d = ruler[i + 1] - ruler[i]
if tab_diff.__contains__(d):
return False
tab_diff.append(d)
index = marks_count - 2
diff_len = 2
for i in range(index, 0, -1):
for j in range(i):
d = 0
for k in range(diff_len):
d += tab_diff[k + j]
if tab_diff.__contains__(d):
return False
tab_diff.append(d)
diff_len += 1
# case of two identical marks
if tab_diff.__contains__(0):
return False
return True
您可以在这里找到我通过元启发式方法(模拟退火和遗传算法)解决的 complete Golomb problem 的存储库: