排序算法 - 查找哪个图表栏看到不同的栏

时间:2015-04-21 07:32:47

标签: algorithm sorting

我很难找到一个 O(n) runtine效率的算法。

如果数组大小为n,则数组包含整数。  我必须知道哪个阵列单元(可以想象为图表栏)正在查看哪个单元格。

正式:lookingAtIndex(i) = max { -1} U {j | arr[j] > arr[i], j<i},其中-1代表y轴。

编辑:第一个高于当前条形图的条形图是什么?如果没有,则为Y轴 示例,提供数组:7,3,5,2,1,9 ..

然后7在y轴上看,3在7看,5看7,2在5,1和2和9在y轴上。

我有点失落,我所做的每件事都留在O(nLogn)。 它不是一个完整的排序算法,因此可以用O(n)来完成。 在运行时打印结果,无需将信息存储到最后。

3 个答案:

答案 0 :(得分:8)

你可以用一个简单的堆栈来完成它。

Compare each element a[i] with the top of the stack T
while ( T <= a[i] ) 
   pop T
if the stack is empty
   a[i] is looking at the y-axis
else
   a[i] is looking at T
push a[i] onto the stack

例如,使用数组[7,3,5,2,1,9]

a[0]=7 T=empty     7 is looking at y-axis
a[1]=3 T=7         3 is looking at 7
a[2]=5 T=3 pop 3
       T=7         5 is looking at 7
a[3]=2 T=5         2 is looking at 5
a[4]=1 T=2         1 is looking at 2
a[5]=9 T=1 pop 1
       T=2 pop 2
       T=5 pop 5
       T=7 pop 7
       T=empty     9 is looking at y-axis

请注意,每个数字都被压入堆栈,每个数字只能从堆栈弹出一次,因此堆栈操作的数量最多为2N,整个算法为O(n)。

答案 1 :(得分:1)

我提出了一个线性解决方案,前面有一个很大的因素。所以我认为这可能不是最好的解决方案。

这是事情。让我们调用长度为I的整数n的输入数组。设M IO(n)中的最大数字I。我首先假设M中的最小值为0;如果不是,减去最小值不会改变解决方案,max(I)-min(I)在一般情况下T

创建长度为m的数组I,所有元素都设置为-1。这个数组是&#34的索引的存储;看着&#34; S中每个可能的整数的条形图;初始化为-1,虚拟最左侧栏的索引。

创建数组e作为输出数组o&#34; look-at&#34;的索引。杆

现在,对于数组中索引为I的{​​{1}}中的每个元素i,它会查看索引正好为T[e]的条形图。所以S[i] = T[e]。然后使用值T[0..e]设置所有元素i

在循环结束时,S填充了&#34;查看&#34;的索引。酒吧;很容易找回这些酒吧的价值。

如您所见,总体复杂度为O(M*n),因此复杂度与I的长度呈线性关系。由于我之前说过的因素M,它可能效率不高(欢迎任何改进)。

修改

更喜欢user3386109的解决方案,相比之下,我很尴尬。

答案 2 :(得分:0)

让我们说我们有一个完成的阵列:...... A - B,

和lookingAtIndex(A)= X,让我们找到B的结果:  如果A> B然后它是A,否则A和lookingAtIndex(A)之间的所有索引都不是一个好的答案,因为它们小于A,  如果lookingAtIndex(A)&gt;那么它的答案就是看看atIndex(lookingAtIndex(A))等...

但是您需要一种方法来存储每个索引的条形图,我认为user3386109给出的堆栈的想法是一个非常好的实现,并且您只需要存储所需的值< / p>