Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 阵列中特定类型反演的计数算法_Algorithm - Fatal编程技术网

Algorithm 阵列中特定类型反演的计数算法

Algorithm 阵列中特定类型反演的计数算法,algorithm,Algorithm,我需要一个计算类型反转的算法: 如果a的指数较低且a>2b,则a和b之间存在反转 你能想出一个在O(nlogn)中实现的算法吗?它可以通过对合并排序算法的一个小调整来实现 在合并阶段的正常标准算法中,比较左半部分和右半部分的元素,并通过左半部分剩余的元素数增加反转。在这里,我们不是通过左半部分剩余的元素数量来增加,而是通过左半部分剩余的元素数量来增加,左半部分的元素数量是左半部分的两倍以上。这可以通过使用动态顺序统计数据结构来解决。我知道这种结构有两种选择: A[1..n] B[1..n] =

我需要一个计算类型反转的算法: 如果a的指数较低且a>2b,则a和b之间存在反转


你能想出一个在O(nlogn)中实现的算法吗?

它可以通过对合并排序算法的一个小调整来实现


在合并阶段的正常标准算法中,比较左半部分和右半部分的元素,并通过左半部分剩余的元素数增加反转。在这里,我们不是通过左半部分剩余的元素数量来增加,而是通过左半部分剩余的元素数量来增加,左半部分的元素数量是左半部分的两倍以上。

这可以通过使用动态顺序统计数据结构来解决。我知道这种结构有两种选择:

A[1..n]
B[1..n] = copy(A)
sort(B) //n*log(n)

for i = 1 to n-1
  //log(n)
  exists = specialBinarySearch(B, A[i], 1, n)

  //log(n)    
  setHighest(B, A[i], 1, n)
  if exists
    count++

specialBinarySearch(a, key, from, to)
  if from <= to
    mid = from + (to-from)/2

    if a[mid] < floor(key/2)
      return true
    else //must go to left of it to get even smaller value
      specialBinarySearch(a, key, from, mid-1)
  else
    return false

setHighest(a, key, from, to)
  if from <= to
    mid = from + (to-from)/2
    if a[mid] == key
      a[mid] = INT_MAX
    else if a[mid] < key
      setHighest(a, key, mid+1, to)
    else
      setHighest(a, key, from, mid-1)
  • 对于按顺序排列的数组(
    b
    )的每个元素,在order statistics数据结构中查找值
    2b
    的秩。然后将
    b
    插入订单统计数据结构


    2b
    的秩给出了索引较低且小于
    2b
    的元素数
    a
    。这些数字的总和给出了“反演”的数量。

    这个算法寻找标准反演,我的问题是关于其他的:我需要满足条件a>2b(不是a>=b)。不管怎样,谢谢你,只需要一个额外的AND条件就可以了。不幸的是,指针跳过倒数的问题。例如,将[3 10]与[2 4]合并会在将右半部分的指针与3进行比较后将其向前移动,即使反转是在10和2之间形成的。您建议的算法将返回1个反转,而正确答案是2。实际上,您需要增加的不是左半部分剩余的元素数,而是左半部分剩余元素数的两倍多。这是一个clrs问题,不是吗?
       O(n) + O(n*log(n)) + n*O(log(n))
    => O(n*log(n)) asymptotically