当前位置:网站首页 > 时间管理与高效工作 > 正文

莫队算法复杂度(莫队时间复杂度)



这篇文章是对上周发的 11大排序 这个视频中提到的 时间复杂度空间复杂度 进行一个解析,有问题可以在评论区提,觉得我说得不对也可以在评论区指出哈。

当 i = 0 的时候,j 从 1 到 n-1,内层循环执行次数为 n-1 次;

当 i = 1 的时候,j 从 2 到 n-1,内层循环执行次数为 n-2 次;

... (根据数学归纳法)

当 i = n-2 的时候,j 从 n-1 到 n-1,内层循环执行次数为 1 次;

所以总的执行次数就是  (1 + (n-1)) * (n-1) / 2 = n * (n - 1) / 2;

所以时间复杂度就是 O(n^2)

由于在进行循环计算的时候

只用到了一个 min 作为额外变量

所以空间复杂度就是 O(1)

内层循环做的事情

是在一个区间内寻找一个最小值

然后把最小值更新为另一个值

这样的操作

可以用线段树来进行优化

使得查找最小值和更新区间值的操作

内层循环的时间复杂度降为 O(logn)

所以总的时间复杂度就是 O(nlogn)

当 i = n-1 时,j 从 0 到 n-2,内层循环数是 n-1

当 i = n-2 时, j 从 0 到 n-3,内层循环数是 n - 2

...(根据数学归纳法)

当 i = 1 时, j 从 0 到 0,内层循环数是 1

所以总的执行次数就是  (1 + (n-1)) * (n-1) / 2 = n * (n - 1) / 2;

所以时间复杂度就是 O(n^2)

由于在进行循环计算的时候

没有用到额外变量

所以空间复杂度就是 O(1)

内层循环中

如果发现已经完全有序了

则置一个标志位

并且无须继续排序

这就是优化

当原本就是一个升序序列时

内层循环每次只需要执行一次

总共执行 n 次

所以时间复杂度为 O(n)

当原本是一个降序序列时

内层循环每次需要执行 i 次

总共需要执行 (1 + n) * n / 2

所以时间复杂度为 O(n^2)

然而我们在说时间复杂度的时候

往往说的是最坏时间复杂度

所以这个算法的时间复杂度

就是 O(n^2)

由于没有用到任何的额外变量

所以空间复杂度是 O(1)

插入排序可以利用希尔排序进行优化

下文就会讲到了

假设比较和赋值的时间复杂度为O(1)

首先讨论归并排序最重要的子程序

是一个 O(n) 的归并

给定两个大小为 n1 和  n2 的排序树组 A 和 B

我们可以在 O(n) 时间内

将它们有效地归并成一个大小为 n = n1 + n2 的排序数组

那么请问这个归并过程

被调用了多少次?

由于每次都是对半切

所以整个归并过程类似于一棵二叉树的构建过程

次数就是二叉树的高度即 log n

所以归并排序的时间复杂度为 O(nlogn)

由于归并排序在归并过程中

需要额外的一个辅助数组

且最大长度为序列长度

所以归并排序的空间复杂度为 O(n)

时间复杂度

已经是比较排序中最优的了

无须继续优化

但是空间复杂度是可以优化的

由于在排序的过程中

需要额外的一个辅助数组

所以申请辅助数组内存空间

带来的空间消耗会比较大

所有辅助数组干的事情

都可以在传参进去的数组上进行

这样就省去了内存的频繁申请和释放

上面说了

时间复杂度一定要看最坏情况

所以如果数据导致

分成 x 个桶

但是只有第一个桶有元素

其他桶都没有元素

这时候就会退化成 O(n^2) 的选择排序

所以每个桶中的排序

我们可以采用归并排序

这样一来

最坏情况下

时间复杂度也只是 O(nlogn)

由于要把所有元素

放到桶中

所以总共需要放置的空间为 O(n)

于是空间复杂度就是 O(n)

桶排序对数据要求比较高

并不是适用所有数据类型的排序

所以局限性也比较大

一般不会直接用

除非数据分布比较特殊

一般用到的是 计数排序 和 基数排序

由于计数排序

将所有数字哈希到了哈希表中

所以插入和查找的时间复杂度为O(1)

每个数字插入一次取出一次

总的时间复杂度为 O(n)

假设序列中的元素

都是整数并且返回为 [a, b]

那么令 m = b - a + 1

空间复杂度就是 O(m)

由于计数排序对数据范围是有要求的

如果是非整数

则排序过程需要乘上对应的精度

如果数值太大

则无法完成我们的预期

如果出现了负数

需要加上偏移

总的来说

虽然时间复杂度非常优秀

但是对数据本身的要求会很高

和数字的数据范围有关

假设一个数字最高位为 m 位数

那么 while 循环 m 次

每次内部执行 n 次

总的时间复杂度为 O(mn)

需要建立10个桶

每个桶的元素加起来

总的大小为 n

所以空间复杂度为 O(n)

基数排序是对计数排序的优化

计算数字再大

也可以映射到桶中

容错性会更好

如果本身就是升序的序列

那么快速排序的时间复杂度是 O(n^2)

也就是最坏时间复杂度

类似冒泡排序

使用交换的方式进行排序

如果不算堆栈的消耗

空间复杂度为 O(1)

由于基准点采用了随机

所以基本不可能次次都是最坏情况

平均时间复杂度降为 O(nlogn)

非常优秀的算法

唯一的缺点就是

它是不稳定的

时间复杂度分析

网上说是 O(n^(2/3))

具体怎么证明(先留个坑,今天太困了,留给评论区)

希尔排序是原地排序

所以空间复杂度为 O(1)

时间复杂度分析

由于堆是一棵完全二叉树

所以树的高度为 logn

所以每一次操作最多执行 logn次

所以时间复杂度为 O(nlogn)

由于没有采用任何的空间

所以空间复杂度为 O(1)

到此这篇莫队算法复杂度(莫队时间复杂度)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 我的世界设置时间指令怎么用(我的世界里调时间的指令)2024-12-08 11:18:04
  • max30100工作原理(max30100原理图)2024-12-08 11:18:04
  • 时间指令(我的世界时间指令)2024-12-08 11:18:04
  • 我的世界时间指令(我的世界时间指令晚上)2024-12-08 11:18:04
  • kubelet主要功能(kubelet工作原理)2024-12-08 11:18:04
  • 查看神兽刷新时间指令(查询神兽还有多久刷新的指令100)2024-12-08 11:18:04
  • 我的世界黄昏时间指令怎么用(我的世界黄昏权杖怎么做?)2024-12-08 11:18:04
  • 柯美c7000上市时间(柯美c750i)2024-12-08 11:18:04
  • 泰拉瑞亚时间指令晚上(泰拉瑞亚时间怎么调)2024-12-08 11:18:04
  • 文件管理员工作总结(文件管理员年度总结)2024-12-08 11:18:04
  • 全屏图片