Algorithm 在列表中查找升序三元组

Algorithm 在列表中查找升序三元组,algorithm,list,Algorithm,List,我在一次节目采访中遇到了这个问题,现在还不知道 长度为n的列表,其中的元素都是无顺序的正整数。 找出所有可能的三元组(a,b,c),a

我在一次节目采访中遇到了这个问题,现在还不知道

长度为n的列表,其中的元素都是无顺序的正整数。 找出所有可能的三元组(a,b,c),a 并分析算法的时间复杂度


没有一种通用算法能比O(n^3)更快,因为给定一个不同元素的排序输入,那么输出将具有大小O(n^3),因此仅仅产生输出将需要时间成比例。事实上,即使是一个随机生成的整数列表,在常数因子之前也已经有n^3个三倍

在给定的条件下,您可以简单地按列表顺序迭代所有可能的三元组,并比较它们的排序顺序。这个朴素的解已经是它能渐近得到的最佳解(即O(n^3))

for(int i=0;i

我怀疑你的问题陈述中可能有抄写错误,或者这个问题应该是一个非常简单的简短编码练习。

没有通用算法比O(n^3)更快,因为给定不同元素的排序输入,那么输出的大小将为O(n^3),因此仅仅产生输出将需要时间成比例。事实上,即使是随机生成的整数列表也会有n^3个三倍,直到常数因子

你可以简单地按列表顺序迭代所有可能的三元组,并比较它们的排序顺序

for(int i=0;i

我怀疑您的问题陈述中可能存在转录错误,或者这个问题应该是一个非常简单的简短编码练习。

如果已知只有一小部分三元组(比如k),那么您可能更愿意通过存储指向前一个最小元素的指针来查找所有三元组

算法 准备一个空的数据结构(后面描述的可能选项)

准备一个长度为n的空数组B

然后,对于列表中的每个元素c:

  • 使用数据结构存储列表中小于c(如果存在)的最近元素的索引(在数组B中)
  • 在数据结构中存储c(及其在原始列表中的索引)
  • 然后使用数组B查找比c小的所有元素B,然后再次查找比B小的所有元素a,并将所有这些组合作为输出三元组发出
  • 数据结构 数据结构需要能够存储值、位置对,以便于在所有值小于c的元素上查找最大位置(即最近的位置)

    如果允许值的范围相当小,一种简单的方法是使用一系列数组,其中[k][x]存储[x*2^k,(x+1)*2^k)范围内所有元素的最大位置

    如果值最多有M位(即值在0到2^M-1的范围内),则更新或访问此数据结构都是O(M)操作

    复杂性 给出的方法是O(nM+k)

    如果值的范围更大,则可以使用二叉搜索树的形式而不是数组序列,或者对值进行排序并用其序号值替换值。这样的复杂性为O(nlogn+k)

    数三倍 如果你只想知道这个形式的三元组的总数,那么你可以用O(n)来做

    这个想法与以前类似:

  • 查找每个索引最近的较小元素,以及每个索引较小元素的计数
  • 为每个索引查找下一个较大的元素,以及较大元素的计数
  • 计算每个索引的较小元素计数与较大元素计数的乘积之和
  • 为了得到这个O(n),我们需要能够在O(n)中找到下一个更大的元素。这可以通过以下方式实现:

  • 将当前索引i推送到堆栈中
  • 当[top(stack)]
  • 增量i并返回步骤1
  • 我们还需要能够找到O(n)中较大元素的计数。一旦NGE数组准备好,我们可以通过向后迭代数组和计算来找到计数

    count_greater_elements[i] = count_greater_elements[ NGE[i] ] + 1 if NGE[i] is defined
                              = 0 otherwise
    

    最近的较小元素和计数可以用类似的方法计算。

    如果已知只有一小组三元组(比如k),那么您可能更愿意通过存储指向前一个最小元素的指针来查找所有三元组

    算法 准备一个空的数据结构(后面描述的可能选项)

    准备一个长度为n的空数组B

    然后,对于列表中的每个元素c:

  • 使用数据结构存储列表中小于c(如果存在)的最近元素的索引(在数组B中)
  • 在数据结构中存储c(及其在原始列表中的索引)
  • 然后使用数组B查找比c小的所有元素B,然后再次查找比B小的所有元素a,并将所有这些组合作为输出三元组发出
  • 数据结构 数据结构需要能够存储值、位置对,以便于在所有值小于c的元素上查找最大位置(即最近的位置)

    如果允许值的范围相当小,一种简单的方法是使用一系列数组,其中[k][x]存储[x*2^k,(x+1)*2^k)范围内所有元素的最大位置

    如果值最多有M位(即值在0到2^M-1的范围内),则更新或访问此数据结构是b
    count_greater_elements[i] = count_greater_elements[ NGE[i] ] + 1 if NGE[i] is defined
                              = 0 otherwise
    
    int calc(vector<int> numbers) {
     int n = numbers.size();
     vector<int> less(n), more(n);
     for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++)
       if (numbers[i] < numbers[j])
        less[j]++, more[i]++;
    
     int res = 0;
     for (int i = 0; i < n; i++)
      res += less[i] * more[i];
    
     return res;
    }