当前位置:   article > 正文

带你了解建堆的时间复杂度_建堆时间复杂度

建堆时间复杂度

目录

用向上调整建堆的时间复杂度

1.向上调整建堆的时间复杂度O(N*logN)

2.数学论证

 3.相关代码

用向下调整建堆的时间复杂度

1.建堆的时间复杂度为O(N)

2.数学论证

3.相关代码

完结撒花✿✿ヽ(°▽°)ノ✿✿


博主建议:面试的时候可能会被面试官问到建堆时间复杂度的证明过程,最好背下来,到时候能回答出你就是最靓的仔!!!

     注:堆是完全二叉树,但以满二叉树来分析的原因:

  1. 方便进行数学论证
  2. 满二叉树是特殊的完全二叉树
  3. 满二叉树挂的节点最多,与时间复杂度的计算一般是求是求算法的最坏运行情况相符
  4. 时间复杂度本来看的就是近似值,多几个节点不影响最终结果

用向上调整建堆的时间复杂度

注:一般采用的都是向下调整的方式建堆的,用向上调整建堆比较少

1.向上调整建堆的时间复杂度O(N*logN)

2.数学论证

 3.相关代码

  1. //向上调整来建堆,时间复杂度为 O(n*logN)
  2. Queue<Integer> minHeap = new PriorityQueue<>();
  3. for (int i : arr) {
  4. minHeap.offer(i);
  5. }
  6. //向上调整
  7. private void shiftUp(int child) {
  8. int parent = (child - 1) / 2;
  9. while (child > 0) {
  10. if (elem[child] > elem[parent]) {
  11. int tmp = elem[child];
  12. elem[child] = elem[parent];
  13. elem[parent] = tmp;
  14. child=parent;
  15. parent = (child - 1) / 2;
  16. } else {
  17. break;
  18. }
  19. }
  20. }

用向下调整建堆的时间复杂度

1.建堆的时间复杂度为O(N)

2.数学论证

3.相关代码

  1. /*
  2. * 创建大根堆的时间复杂度:O(N)
  3. * 以满二叉树(挂的节点最多,是特殊的完全二叉树)来分析
  4. * */
  5. public void createHeap() {
  6. for (int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--) {
  7. shiftDown(parent, usedSize);
  8. }
  9. }
  10. /*
  11. * 父亲下标
  12. * 每棵树的结束下标
  13. * */
  14. private void shiftDown(int parent, int len) {//向下调整
  15. int child = parent * 2 + 1;
  16. //最起码 要有左孩子
  17. while (child < len) {
  18. //一定是有右孩子的情况下
  19. if (child + 1 < len && elem[child] < elem[child + 1]) {
  20. child++;
  21. }//点评:这代码写得有意思!!!
  22. //child下标一定是左右孩子 最大值的下标
  23. if (elem[child] > elem[parent]) {
  24. int tmp = elem[child];
  25. elem[child] = elem[parent];
  26. elem[parent] = tmp;
  27. parent = child;
  28. child = 2 * parent + 1;
  29. } else {
  30. break;
  31. }
  32. }
  33. }

完结撒花✿✿ヽ(°▽°)ノ✿✿

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/734250
推荐阅读
相关标签
  

闽ICP备14008679号