数据结构与算法

数据结构

数组
插入快,查找、删除慢,大小固定


后进先出(入栈和出栈的时间复杂度都为O(1))

队列
先进先出(可分为单向队列,双向队列,优先级队列)
【栈和队列均可以通过数组实现,也可以通过链表、堆等数据结构实现】

链表
可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。(可分单向链表,双端链表、双向链表)

二叉树
同时具备数组查找快的优点以及链表插入和删除快的优点

二叉搜索树(二叉排序树)
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
(缺点:若二叉搜索树是排好序的,那么查找的时间复杂度为O(N),而不是O(logN))

红黑树
特点:红黑树是一种平衡的二叉搜索树。通过引入颜色,进而左旋右旋,以达到平衡的效果。
优点:红黑树的查找、插入和删除时间复杂度都为O(log2N),额外的开销是每个节点的存储空间都稍微增加了一点,因为一个存储红黑树节点的颜色变量。插入和删除的时间要增加一个常数因子,因为要进行旋转,平均一次插入大约需要一次旋转,因此插入的时间复杂度还是O(log2N),(时间复杂度的计算要省略常数),但实际上比普通的二叉树是要慢的。


特点:他是完全二叉树,通常用数组来实现,堆中的每一个节点的关键字都大于(或等于)这个节点的子节点的关键字【所以相对于二叉搜索树,堆是弱序的】。

缺点:由于堆的特性,在查找的过程中,没有足够的信息来决定选择通过节点的两个子节点中的哪一个来选择走向下一层,所以也很难在堆中查找到某个关键字。因此,堆这种组织似乎非常接近无序。
优点:对于快速的移除最大(或最小)节点,也就是根节点,以及能快速插入新的节点,这两个操作就足够了。由它实现的优先级队列的插入和删除的时间复杂度都为O(logN)。这样尽管删除的时间变慢了,但是插入的时间快了很多,当速度非常重要,而且有很多插入操作时,可以选择用堆来实现优先级队列。

哈希表
哈希表基于数组,类似于key-value的存储形式,关键字值通过哈希函数映射为数组的下标,如果一个关键字哈希化到已占用的数组单元,这种情况称为冲突。用来解决冲突的有两种方法:开放地址法和链地址法。
在开发地址法中,把冲突的数据项放在数组的其它位置;
在链地址法中,每个单元都包含一个链表,把所有映射到同一数组下标的数据项都插入到这个链表中。


图由 定点 和 边 组成
图是由边连接的顶点组成,图可以表示许多真实的世界情况,包括飞机航线、电子线路等等。搜索算法以一种系统的方式访问图中的每个顶点,主要通过深度优先搜索(DFS)和广度优先搜索(BFS),深度优先搜索通过栈来实现,广度优先搜索通过队列来实现。
最后需要知道最小生成树是包含连接图中所有顶点所需要的最少数量的边。(顶点数 V = 边数 E + 1)

常用算法
递归

冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
时间复杂度 O(N2):
则第一轮排序有 N-1 次比较,第二轮有 N-2 次,…(N-1)+(N-2)+…+1 = N*(N-1)/2
交换和比较次数都和N2 成正比。由于常数不算大 O 表示法中,忽略 2 和 4,那么冒泡排序运行都需要 O(N2)

选择排序
每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
时间复杂度:O(N2):
但是至多只进行了N次交换。当 N 值很大时,比较次数是主要的,所以和冒泡排序一样,用大O表示是O(N2) 时间级别。但是由于选择排序交换的次数少,所以选择排序无疑是比冒泡排序快的。当 N 值较小时,如果交换时间比选择时间大的多,那么选择排序是相当快的。

插入排序
(直接插入排序)每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
时间复杂度: O(N2):
选择排序把交换次数降低到最低,但是比较次数还是挺大的。当数据量小,并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序。在大多数情况下,假设数据量比较小或基本有序时,插入排序是三种算法中最好的选择。

快速排序
分治策略:每次把数组分成两部分,一部分数据总比另一部分小(大),以此往复
过程:基准元素选取–>划分–>递归求解–>组合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值