Python-查找给定列表的邻居数量

时间:2018-10-23 12:34:59

标签: python python-3.x optimization

问题陈述 在号码线上有N个房屋(1个号码中可以有更多房屋)。如果两间房子之间的距离小于给定D的距离,则称它们为邻居(两间具有相同编号的房子之间的距离为1) 找到所有邻居的数量。

从数学上讲,问题可以归结为这一点。给定多重集N和数字D 查找它们之间的距离小于D

的房屋数量
def main():
    number_of_ppl,distance=map(int, input().split())
    inputs=map(int,input().split())

    numbers=sorted(inputs)
    counter=0
    sum=0
    for x in range(0,len(numbers)):

        for y in range(i+1,len(numbers)):

                if abs(numbers[x]-numbers[y])<=distance:
                    counter +=1
                else:
                    break
        sum+=counter
        counter=0
    print(sum)

main()

此代码有效,但是由于时间不足,它在8个测试案例中的3个失败。我有什么想念的吗? 我怎样才能使这种算法更快? 我尝试使用字典,但结果相同

P.S如果有帮助,我可以在该程序失败的情况下发布测试用例

1 个答案:

答案 0 :(得分:0)

您当前的代码不完整,但似乎您正在执行2个循环,如果距离足够大,则需要O(n ^ 2)来运行。可以将其减少为O(n log n)。请注意,当您按顺序迭代数字时,当您对arr [i]的邻居进行分析时,当查看arr [i + 1]的邻居时,它们将是相同的,也许还会更多。

    def main():
        number_of_ppl,distance=map(int, input().split())
        inputs=map(int,input().split())
        numbers = sorted(inputs)

        sum = 0
        pointer = 0
        for idx, number in enumerate(numbers):
            while pointer < len(numbers) and number + distance >= numbers[pointer]:
                pointer += 1
            sum += (pointer - idx)
        print(sum)

    main()