数据结构和算法

全排列

一个字符串全排类 是 N 的阶层。

组合

一个字符串的组合为 2 N次方减一。

‘\0’

在C++中 ‘\0’ 表是为 false。
在这里插入图片描述

字符串的比较

Brute-force 	暴力比较,算法复杂度为 O(m*n)
Rabin-Karp hash比较算法,取出相同子串个数计算hash是否相等,在比较,算法复杂度O(m+n).

Array

在旧的编译器中不能在 stack 上定义一个不确定长度的数组,即数组的大小为用变量来表示。
在新的编译器中是可以使用变量来定义一个数组的大小。

vector 的成员函数 erase(iterator) 返回的是下一个iterator 

hash table

insert O(1)
delete O(1)
find O(1)

list

在单链表中,如果想要删除当前的结点,可以将下一个结点的数据赋值到当前,结点,删除下一个结点,做了一个替换的工作(这个效果尾部不能使用)。

使用 dummy node 是为了方便在单链表中,删除头节点头节点丢失,且单链表在删除结点一般都是想要删除下一个结点。这样子操作会更方便。

快慢指针的计较,可以获取到中间元素的值,可以判断闭环。可以找链表末尾倒数第几个结点(第几个结点,就让快指针提前出发几步)。

递归的思路是先判断条件,在层层深入,最后在处理。

stack && queue

stack 辅助实现深度优先算法,
queue 辅助实现广度有限算法。

递归思想

递归思想就是三点: 退出条件,自己调用自己,执行处理。
链表递归
目的:想要从后往前处理链表结点。
操作:根据三种思想,
		first step : 写出判断条件,即当前指向为空返回(结束递归)
		second step : 调用自己,传入下一个结点。
		third step: 执行处理。
树的递归
目的:遍历问题(DFS,深度遍历)。
前序遍历:根->左->右
	first step : 判断退出条件
	second step:  执行处理
	third step: 调用自己,传入左子树
	fourth step: 调用自己,传入右子树
中序遍历:左->根->右
	first step: 判断退出条件
	second step: 调用自己,传入左子树
	third step: 执行处理
	fourth step: 调用自己,传入右子树
后续遍历: 左->右->跟
	first step : 判断退出条件
	second step: 调用自己,传入左子树
	third step : 调用自己,传入右子树
	fourth step: 执行处理

binary tree

度数:当前结点的子节点个数
深度:  树总共有多少层数
层数(level):从根结点到 某节点的路径长度。
根结点是第 0 层,深度和最大层数是 depth + 1 = maxLevel
二叉树的第i层最多有多少个结点 第一层 2^(1)  ,第 i 层 2^(i)
二叉树 对多有多少个结点, 深度为1  时 2^1 -1 , 深度为 k 时 2^k -1
full binary tree (满二叉树) : 除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树,
complete binary tree (完全二叉树): 只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树
balanced binary tree (平衡二叉树):  左右子树的高度差不超过1,空树也是平和二叉树。
深度优先算法(DFS : depth-first search)
树的周游: 前序周游( pre-order traversal ) , 中序周游 ( in-order traversal ), 后续周游 ( post-order traversal ). 
	前序周游 ( pre-order traversal ): 先访问 根节点,在访问 左子节点, 最后访问 右子节点。目的:根节点在前,左右子树在后。
	中序周游 ( in-order traversal ) : 先访问 左子节点, 在访问 根节点,最后访问 右子节点。目的:左节点在 根节点前,右节点在根节点后,根节点成了分割点。
	后序周游 ( post-order traversal ) : 先访问 左子节点, 在访问 右子节点, 最后访问 根节点。目的:左右子树在前,根节点在后。
	三种周游记忆法: 不管是 前序,中序,后序,表述的都是 对于当前的根节点而言,且不管是什么访问方式 都是先访问 左子节点,在访问 右子节点...。前序:则访问当前根节点为第一位。 中序:则访问当前结点为第二位。 后序:则访问当前结点为第三位。
树的问题一般会考虑递归,当然可以使用 stack的特性来将递归转变为非递归。 
广度优先算法(BFS : breadth-first search)
层次周游( level-order traversal ): 先访问第0 层,且从左往右,接着访问 第 i 层,继续往下访问 i+1 层。

sorting and binary search

内排序
内排序:所有的数据已经读入内存,排序过程不需要堆磁盘进行读写。
merge sort (nlogn):递归将数组分为两部分,对两部分进行排序,最后在合并。
quick sort : 随机抽取一个轴值,将数组中的元素与轴值相比较,小于轴值放在左边,大于轴值放在右边,(注意:这时左右数组并不是排序,),在将左右两边的数组递归调用
merge sort 是先递归到底部,当左右两边数组各位1时,他们左右两边也就是sorted的数组,在左右两边合并,。。。quick sort 是先 将左右两边大小划分好,在递归划分。
heap sort :与 BST	相似,不过 heap 是根节点大于左右子树。优先级队列 priority_queue就是使用堆排序的特性实现。 heap用数组表示,heap 规定:root的下表为1,且其左孩子是2n,有孩子是2n+1, n为当前结点下标
bucket sort and radix sort :桶排序,是将数组中得数值,在对应的桶打一个标签,表示该数组桶中的位置,桶的位置其实已经表示该数组的排序。
外排序
外排序:内存无法保存全部数据,需要进行磁盘访问,内次读入部分数据到内存排序。
堆排序
二分搜索

11-11.32

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值