数据结构及算法笔记

算法
二叉树:二叉树是一个每个最结最多只能有两个分支的树,左边的分支称之为左子树,右边的分支称之为右子树
完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树
完美二叉树:国际标准定义是除了叶结点外每一个结点都有左右子结点的二叉树
叶子节点:A node with no children
平衡二叉树:是一棵空树或它的任意节点的左右两个子树的高度差的绝对值不超过1

二叉树的应用场景
普通的二叉树,很难构成现实的应用场景,但因其简单,常用于学习研究,平衡二叉树则是实际应用比较多的。常见于快速匹配、搜索等方面。
常用的树有:AVL树、红黑树、B+树、Trie(字典)树。
1、AVL树: 最早的平衡二叉树之一。应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树。
2、红黑树: 平衡二叉树,广泛用在C++的STL中。如map和set都是用红黑树实现的。还有Linux文件管理。
3、B/B+树: 用在磁盘文件组织 数据索引和数据库索引。
4、Trie树(字典树): 用在统计和排序大量字符串,如自动机、M数据库索引。

堆的数据结构:
堆是一个完全二叉树;
堆中每个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。

最小堆,是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于其左子节点和右子节点的值。, 对应最大堆的定义
最大堆:根结点的键值是所有堆结点键值中最大者。
最小堆:根结点的键值是所有堆结点键值中最小者

最小时间堆逻辑:
1 // 下面就是shift_up()的代码逻辑,不断的将new的“预留位置”向上调整
2 _hole = size; // _hole就是为new预留的位置,但并不立刻将new放上
3 while(_hole>0) // 循环
4 {
5 _parent = (_hole-1)/2; // 计算parent
6 if(Heap[_parent].key < new.key)
7 break; // 调整结束,跳出循环
8 Heap[_hole] = Heap[_parent]; // 将parent向下调整
9 _hole = _parent; // 将_hole调整到_parent
10 }
11 Heap[_hole] = new; // 调整结束,将new插入到_hole指示的位置
12 size++; // 元素个数+1

C++语言提供了虚函数来实现多态,在C语言中,这是通过函数指针实现的。对于各类函数指针的详细说明可以参见文章:http://blog.csdn.net/sparkliang/archive/2009/06/09/4254115.aspx

位运算:
消除位标志EVLIST_ACTIVE: evcb->evcb_flags &= ~EVLIST_ACTIVE;
判断是否包含某些标志位: (ev->ev_events & (EV_READ|EV_WRITE|EV_CLOSED|EV_SIGNAL) ev_events 是否被置这些位 EV_READ|EV_WRITE|EV_CLOSED|EV_SIGNAL
#define OA_FF 0xff
判断是否只有8位有值, 其它高八位有值则非法 : !(flgs& ~OA_FF)
置EVLIST_TIMEOUT位:ev->ev_flags |= EVLIST_TIMEOUT; 一般先获取原先的置位, 然后再执行该操作

最小公倍数=两数之积/最大公约数

c语言的接口:
C 库函数 double pow(double x, double y) 返回 x 的 y 次幂,即 xy。
strncat函数
原型:strncat(str1,str2,n); strcat(str1, str2)
功能:将字符串str2的前n个字符添加到字符串str1的尾部
strstr(str1,str2);;判断str1是否是str的字符串

	原型:strchr(str,c);
	功能:在str字符串中查找首次出现字符c的位置(从字符串的首地址开始查找)

	原型2:strrchr(str,c);
	功能2:在字符串str中从后向前开始查找字符c首次出现的位置
	
	大写转小写:strlwr(字符数组)
	小写转大写:strupr(字符数组)

猜你喜欢

转载自blog.csdn.net/yuyixiong/article/details/111993162
今日推荐