数组和链表是我们经常使用的数据结构,我们都知道数组的存储地址是连续的,链表的存储地址是不连续的,这就给我们的使用提供了多种选择。下面简单的分析一下数组和链表分别在有序和无须情况下的时间复杂度。
1、有序数组的删除:数组的存储地址是连续的,我们删除数组中的某个值,首先我们要找到要删除的值,删除此值后,若此值后面还有其他值,每个值的都要向前移动一位,即索引减去1。
分析
:在数组为有序的情况下,查找数组中的某个元素时,采二分法查找,每次排除一半的数据,时间复杂度为O(logn)。
而移动数组元素改变索引时间复杂度为O(n)。
所以有序数组的删除时间复杂度为O(n)+O(logn),即为O(n)级别。
若删除的数组元素为末尾一个,则时间复杂度为O(logn)。
2、有序数组的添加:有序数组的添加类似于有序数组的删除,先要找到添加的位置,然后要移动该元素后面的值。
分析
:数组有序,采用二分查找,找到添加的位置,当然查找可以使用遍历查找,这里只是考虑时间复杂度最小的情况。然后移动插入位置后面元素的索引即可。
和有序数组的删除同理,时间复杂度为O(n)+O(logn),即为O(n)级别。
3、有序数组的修该:有序数组的修改,首先要找到要修改的值,然后还要保证数组的有序性。
分析
:首先查找和上面的相同,采用二分查找,时间复杂度为O(logn),修改完数值之后还要进行移动数据,因为数组本身是有序的,不需要采用其他方法进行重新排序,进行移动数据即可,因此时间复杂度最小为O(n),当然采用其他方式也可以,时间复杂度会变大。
4、无序数组的增加:添加在数组末尾时,时间复杂度为O(1)。不添加在末尾时,添加了一个值时,会改变其他值的索引,所以时间复杂度为O(n)。
5、无序数组的删除:首先找到要删除的数据,时间复杂度为O(n),删除后要移动索引,时间复杂度为O(n),所以总的时间复杂度为O(n)+O(n)即O(n)级别。
6、无序数组的改动:找到要改动的值,直接修改即可,即查找的时间复杂度O(n)。
1、有序链表的增加:因为链表的有序只是数值上的有序,地址上是不连续的,所以,有序链表的添加,在遍历一遍找到添加的位置即可。所以时间复杂度为遍历的时间复杂度O(n)。
2、有序链表的删除:原理和添加类似,在遍历查找删除节点的时候,可以把前后节点记录下来,删除后直接把前一个节点的指向指到后一节点即可。因此时间复杂度为O(n)。
3、有序链表的改动:有序链表的改动首先要遍历查找要插入的位置,平均查找次数为n/2,所以时间复杂度为O(n)级别。
4、无序链表:对于无序链表,链表本身的存储位置就不是连续的,各种操作只是查找操作存在时间复杂度。
而当在无序链表头部插入一个值时,只需要查找一次,因此时间复杂度为O(1)。其他操作均需要平均查找n/2次,因此时间复杂度为O(n)级别。
数组和链表是我们经常使用的数据结构,我们都知道数组的存储地址是连续的,链表的存储地址是不连续的,这就给我们的使用提供了多种选择。下面简单的分析一下数组和链表分别在有序和无须情况下的时间复杂度。数组1、有序数组的删除:数组的存储地址是连续的,我们删除数组中的某个值,首先我们要找到要删除的值,删除此值后,若此值后面还有其他值,每个值的都要向前移动一位,即索引减去1。分析:在数组为有序的情况下,查...
写在最前面:给好朋友写的算半个错题集的文章,很多都不是原创。不过我觉得考试里面的选择题、填空题、判断题大部分都能在里面找到相应的知识点,以后可能会来完善吧,知识概念比较多,没有关于算法的代码(因为本人是在太菜惹)
当问题的规模n趋向无穷大时,算法执行时间T(n)的数量级被称为算法的
时间复杂度
。通常情况下,鉴于运算空间较充足,人们都以算法的
时间复杂度
作为算法优劣的衡量指标。
空间复杂度也是问题规模n的函数。
评价一个算法时间性能的主要标准是算法的
时间复杂度
。
数据项:数据的最小单位
数据元素:数据的基本
折半查找对
链表
而言根本不能达到O(logN)的效率。只有当访问集合中任何一个元素的时间
是常量O(1)时间时,折半查找才能达到O(logN),而
链表
访问其中元素的平均时间是O(N)即
线性时间。对用
数组
构造的集合才能使用折半查找。
3.存在若若干字符串,查找具有相同前缀 采用哪种
数据结构
4.删除视图 drop view view_name
5.在DNS系统测试时,设named进程号是53,命令(kill–HUP53)通知进程重读配置文件。
6.epoll的水平触发和边沿触发区别
水平触发LT:缺省的工作方式(epoll默认的设置),并且同时支持block和n
链式存储方式:存储结构能反映数据之间的的逻辑关系。
散列存储:通过散列函数映射到物理空间,不能反应数据之间的逻辑关系。
**3.**顺序存储方式:不只是可以存储线性结构,还可以存储“树”,“图”。
线性表采取顺序存储时:取线性表的第i个元素的时间与i的大小无关。
线性表采取链式存储时:取线性表的第
1、
时间复杂度
的定义:在计算机科学中,算法的
时间复杂度
是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了
时间复杂度
这个
分析
方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本
操作
的执行次数,为算法的
时间复杂度
。
因为不同的机器性能大概率是不同的,所以同一段程序可能在不同的机器上运行的时间不同,所以运行一个程序的时间不
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录1.什么是
数据结构
数据结构
原理大O渐进表示法2.
时间复杂度
算法效率
时间复杂度
原理简单示例3.空间复杂度原理简单示例
1.什么是
数据结构
数据结构
(Data Structure)是一门研究数据的组织和管理的学科。往往从外在表现为一组数据的集合或者容器。
概念解释:
元素(Element):被管理的原子数据,元素类型不限。
集合(Collection):存放元素的容器,需要利用一定的
数据结构
知识对元素进行组织。
遍历(Traversa
查找
有序
数组
指定元素,返回目标元素下标,如果不存在,则插入适当位置使
数组
仍然保持
有序
,
时间复杂度
为O(log(n)),该算法是基本查找算法,可以用二分法。下面是代码实现。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int size = nums.size(), left = 0, right = size - 1, mid = 0;
while (l
对于一个
有序
数组
,如果要查找其中的一个数,我们可以使用二分查找(Binary Search)算法,将它的
时间复杂度
降低为O(logn).那查找一个
有序
链表
,有没有办法将其
时间复杂度
也降低为O(logn)呢?
跳表(skip list),全称为跳跃
链表
,实质上就是一种可以进行二分查找的
有序
链表
,它允许快速查询、插入和删除
有序
链表
。
跳表使用的前提是
链表
有序
,就像二分查找也要求
有序
数组
怎么理解跳表
比如我们有一个原始
有序
链表
,如下图所示。
链表
归并是一种常见的
链表
操作
,它可以将两个
有序
链表
合并成一个
有序
链表
。在实现
链表
归并时,需要注意
链表
的头指针和尾指针的变化,以及
链表
节点的比较和插入
操作
。具体实现可以使用迭代或递归的方式,其中递归实现更为简洁。
在实现
有序
链表
归并时,可以先比较两个
链表
的头节点,将较小的节点插入到新
链表
中,然后将指针指向下一个节点,直到其中一个
链表
为空。最后,将剩余的节点插入到新
链表
的尾部即可。
有序
链表
归并是一种常见的算法,可以用于排序、搜索等应用场景。在实际开发中,需要注意
链表
的内存管理和错误处理,以确保程序的正确性和稳定性。