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
Java 增加所有叶元素值的两种解决方案_Java_Algorithm_Big O_Heapsort - Fatal编程技术网

Java 增加所有叶元素值的两种解决方案

Java 增加所有叶元素值的两种解决方案,java,algorithm,big-o,heapsort,Java,Algorithm,Big O,Heapsort,我想增加所有叶元素的值。所有索引均大于*楼层[n/2] 1) 为每个叶元素调用HEAP-INCREASE-KEY(A,i,KEY) 2) 将每个叶元素的键增加到新值,然后调用BUILD-MAX-HEAP(A) 哪种方式更有效?为什么 再加上一点额外的信息,每个对Max Heapify的调用都会花费O(lgn)个时间,而Build Max heap会进行O(n)个这样的调用。因此,运行时间为O(nlgn)。堆增加键的运行时间为O(lgn) 堆增加键(A,i,键) 如果你想知道max heapify

我想增加所有叶元素的值。所有索引均大于*楼层[n/2]

1) 为每个叶元素调用HEAP-INCREASE-KEY(A,i,KEY)

2) 将每个叶元素的键增加到新值,然后调用BUILD-MAX-HEAP(A)

哪种方式更有效?为什么

再加上一点额外的信息,每个对Max Heapify的调用都会花费O(lgn)个时间,而Build Max heap会进行O(n)个这样的调用。因此,运行时间为O(nlgn)。堆增加键的运行时间为O(lgn)

堆增加键(A,i,键)

如果你想知道max heapify是什么

MAX-HEAPIFY(A,i)

l=左(i)
r=右(i)
如果l A[i]
最大=l
其他最大的=i
如果r A[最大]
最大=r
如果最大不等于i
与[最大的]交换A[i]
MAX-HEAPIFY(A.最大)

第二个更有效

1) 为每个叶元素调用HEAP-INCREASE-KEY(A,i,KEY)

叶元素的数量为
O(n)
HEAP-INCREASE-KEY(A,i,KEY)
的时间是
O(lgn)
。因此,第一个解决方案的时间复杂度是
O(nlgn)

2) 将每个叶元素的键增加到新值,然后调用 BUILD-MAX-HEAP(A)

从头开始构建堆只需要线性时间。因此,第二种解决方案的时间复杂度是
O(n)

一点额外的信息,每次打给Max Heapify的费用为0(lgn) 时间,而Build max heap进行O(n)个这样的调用。因此,运行时间 是O(nlgn)


如果你的家庭作业中提供了这一陈述,那么两种解决方案的时间复杂性是相同的。但是,您可以在
O(nlgn)
时间内构建最大堆。

第二个堆效率更高

1) 为每个叶元素调用HEAP-INCREASE-KEY(A,i,KEY)

叶元素的数量为
O(n)
HEAP-INCREASE-KEY(A,i,KEY)
的时间是
O(lgn)
。因此,第一个解决方案的时间复杂度是
O(nlgn)

2) 将每个叶元素的键增加到新值,然后调用 BUILD-MAX-HEAP(A)

从头开始构建堆只需要线性时间。因此,第二种解决方案的时间复杂度是
O(n)

一点额外的信息,每次打给Max Heapify的费用为0(lgn) 时间,而Build max heap进行O(n)个这样的调用。因此,运行时间 是O(nlgn)


如果你的家庭作业中提供了这一陈述,那么两种解决方案的时间复杂性是相同的。但是,您可以在时间而不是
O(nlgn)
time中构建一个最大堆。

这本书中提供了该语句。因此,如果它们的索引都大于*floor[n/2],这不会影响任何内容?@GiBiT09我认为该条件适用于任何叶元素。@GiBiT09没有问题。稍后让我知道你的教授的想法:)@GiBiT09顺便说一句,最好添加语言标签,这样你的问题就可以得到更多的关注。这句话在书中提供了。因此,如果它们的索引都大于*floor[n/2],这对任何事情都没有影响?@GiBiT09我认为这个条件适用于任何叶元素。@GiBiT09没问题。稍后让我知道你的教授的想法:)@GiBiT09顺便说一句,最好添加语言标签,这样你的问题可以得到更多的关注。
if key<A[i]
  error "new key is smaller than current key.
A[i]
while i>1 and A[Parent(i)]<A[i]
  exchange A[i] with A[Parent(i)]
  i=Parent()
A.heap-size = A.length
for i = *floor[A.length/2] downto 1
    MAX-HEAPIFY(A,i)
l=Left(i)
r=Right(i)
if l<=A.heap-size and A[l] > A[i]
   largest = l
else largest = i 
if r<=A.heap-size and A[r] > A[largest]
  largest = r
if largest not equal i
   exchange A[i] with A[largest]
   MAX-HEAPIFY (A.largest)