随记3-时间复杂度(上)

前言:

单独拎出这个来讲,是因为它很重要,通过算法的“时间复杂度”可以筛选出更高效的算法,提高处理数据和代码运行的效率,以及后续的优化

OS:之前看数据结构的时候,老是碰到这个时间复杂度,给我看的是一脸懵,于是才专门去研究了一下


正文:

时间复杂度的概念:

衡量算法运行效率的核心指标

简单来说就是你运行的代码有多费时间


常用的分类(时间复杂度鄙视链):

1.O(1) 常数时间

原理:无论数据多大,操作步骤(时间)不变

举例:你面前有100本书,在你已知位置的情况下,你想找到一本“程序猿的自我修养”的书,不需要一本一本找,直接走到书所在的位置拿

特性:无循环、无递进、直接操作

比如我随记1中所写的顺序表的随机(任意)访问就是O(1)的体现

结论:神仙级别,能用就不要犹豫,操作时间快得一批

 

2.O(log n)对数时间

原理:每次操作会将问题规模“砍半”,数据越大,效率优势越明显

举例:猜数字1→100,只需要从中间猜,最多7次就能猜中

特性:变量是指数级变化

结论:高手级别,每次将问题规模砍一半,数据量越大,优化效果越明显,通常都是高效算法

 

3.O(n)线性时间

原理:操作步骤(时间)和数据量成正比,数据量翻倍的同时,操作步骤翻(时间)翻倍

举例:从1数到100要数100次,数到1000要1000次

结论:普通选手,该遍历的就老老实实遍历

特性:单层循环遍历所有数据

 

4.O(n log n)线性对数时间

原理:核心策略是“先分再合”,先将数据分成小块处理(分治策略),每块处理时间为O(log n),总共有n块,直到将数据分到最后只剩一个元素

通俗易懂来讲👇🏻

先将数据砍一半,变成两组之后,两组分别再砍一半,以此类推,直到每个数组里面只剩下一个元素,然后再按照特定的规则合并两个相邻的元素

举例:有一组数字[9,1,6,4,3,8,7],按照从小到大的方法排序[]

1.先从中间砍两半,[9,1,6,4]和[3,8,7]

2.继续砍[9,1],[6,4],[3,8],[7]

3.直到砍到每个数组只剩下一个元素[9],[1],[6],[4],[3],[8],[7]

4.按特定的规则合并两个相邻的元素

[1,9],[4,6],[3,8],[7]

                         ↓

[1,4,6,9],[3,8,7]

                          ↓

[1,3,4,6,7,8,9]

结论:精英选手,属于是排序算法领域比较拔尖的,运到排序问题,记住“归并”和“快排”就够了

 

未完待续……


 

今天先总结到这里,剩下的后面再出一篇文章讲完,因为学的没有那么深的缘故,所以后面学习碰到相关的内容会加进来进行补充,文章有不对的地方,随时欢迎大家指出😊

 

 

开发相关随记包含多个方面: - **软件开发**:在增加和设计较为庞大的程序时,要考虑程序结构设计,如解耦、层与层接口、模块之间关系、参数、ram、flash、运行速度等。还可学习了解aoutosar的分层结构。新的项目需在较短时间完成从零编码到交付[^1]。 - **IsaacLab开发**:遇到在spring - damping模型下,调大限制和刚度、damping参数后出现异常情况,几十个episode插入后不在孔周围晃,此现象与预期不符,需进一步理顺[^2]。 - **Chrome扩展程序开发**:Map是新的数据类型,可在JavaScript中用于存储键值对实现快速查找,还给出了本地缓存工具的代码实现,同时列举了一些相关学习参考资料,如ReqBin在线API测试工具、Chrome插件开发攻略等[^3]。 ```javascript let data = new Map([ ['Alice', 25], ['Bob', 30], ['Charlie', 35], ['David', 40] ]); console.log(data.get('Alice')); // 25 var myLocalStorageTool = { set: function(key, value) { localStorage.setItem(key, value); }, get: function(key) { return localStorage.getItem(key); }, remove: function(key) { localStorage.removeItem(key); }, removeAll: function() { localStorage.clear(); }, toJsonString: function(jsData) { return JSON.stringify(jsData); }, toJsData: function(jsonString) { return JSON.parse(jsonString); } }; ``` - **X86平台开发**:对于intel的X86平台,intel提供完整数据手册和丰富资源,不同卷册有不同内容,如vol 1是整体介绍,vol 2是CPU部分寄存器说明等,还有PDG、硬件设计指南、散热文档、产线可制造性文档等可供参考[^4]。 - **通用开发问题**:client的定时器是通用功能,但依赖cocos2d的Scheduler类,导致移植到server端困难,使用C++标准库实现可避免该问题[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值