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