Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以O(n*常数)为单位,计算有序列表中有中间值的三元组数(例如,秒第一=第三秒)_Python_Algorithm_Complexity Theory - Fatal编程技术网

Python 以O(n*常数)为单位,计算有序列表中有中间值的三元组数(例如,秒第一=第三秒)

Python 以O(n*常数)为单位,计算有序列表中有中间值的三元组数(例如,秒第一=第三秒),python,algorithm,complexity-theory,Python,Algorithm,Complexity Theory,我有一个正整数的有序列表(从0到200万随机选择),我需要找到符合此条件的可能三元组的数量: 第二个和第一个之间的差值等于第三个和第二个之间的差值。换句话说,这里是一个有序的三元组:(x,y,z),我需要:y-x=z-y。一个必要条件是问题在O(n)或O(n*logn)中自行解决 可能的差异数量未知,如果存在三胞胎 例如,这里有一个例子:列表是[1,3,4,7,9,10,11] 有4个明显的差异,但1个给出了2个不同的三联体,因此总共有5个三联体具有中间值 三重态,差异 [1,4,7]3 [4,

我有一个正整数的有序列表(从0到200万随机选择),我需要找到符合此条件的可能三元组的数量: 第二个和第一个之间的差值等于第三个和第二个之间的差值。换句话说,这里是一个有序的三元组:(x,y,z),我需要:y-x=z-y。一个必要条件是问题在O(n)或O(n*logn)中自行解决

可能的差异数量未知,如果存在三胞胎

例如,这里有一个例子:列表是[1,3,4,7,9,10,11] 有4个明显的差异,但1个给出了2个不同的三联体,因此总共有5个三联体具有中间值

三重态,差异

[1,4,7]3

[4,7,10]3

[3,7,11]4

[7,9,11]2

[9,10,11]1

所以我想到了一个简单的算法(O(n^2)),但它花费的时间太多了: (maxi几乎是列表中的最大值)

c=set(lst)
计数=0
对于范围内的i(len(lst)):
标志=1
k=i+1
而k maxi:
标志=0
如果c中的(e+diff):
计数+=1
k+=1
打印(计数)
响应此问题的完整算法的repl:

我想到了其他解决方案,比如使用AVL或hashmap,但由于未知的差异,我无法找出所有的三元组,我研究了子集和问题,但它似乎没有响应我的请求


有趣的是,但我不确定如何应用它,因为我不知道哪个元素是中间元素:

我认为O(n^2)是最好的选择,因为如果列表中的所有整数都是等距的,那么结果的数量将缩放为~n^2,这给了算法一个下限。我认为这在
O(n)中是不可能的
这是我首先想到的,但问题似乎在不到O(n^2)的时间内就解决了(因此O(nlog(n)或O(nconstant)),因为这个示例没有经过测试用例。您确定需要生成三元组吗?还是只生成三元组的计数?只有计数,三元组在这里解释问题
    c=set(lst)
    count=0
    for i in range(len(lst)):
      flag=1
      k=i+1
      while k<len(lst) and flag:
        e=lst[k]
        diff = e - lst[i]
        if diff * 2 > maxi:
            flag = 0
        if (e + diff) in c:
            count += 1
        k+=1
    print(count)