是有效的Golomb标尺

时间:2014-10-05 04:59:51

标签: algorithm python-2.7

我想编写一个函数,可以测试数字列表是否是有效的Golomb标尺。我知道如何在O(n ^ 2)时间内完成它(使用嵌套for循环),但我正在寻找一种简单且更优化的方法。我试图在python中执行它,我的函数将整数列表作为参数。

Golomb标尺定义为一组:

IFF

(维基百科)

2 个答案:

答案 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 的存储库:

GolombProblem_Metaheuristic_Project