基础 数据结构
公式:某些无法用markdown表达的公式,比如【底数】就用word 生成,转成图片。
cnblog markdown引擎 不支持平方公式 2^2 = 4,因为都能看懂,就没有转换 成图片
结构体 struct
c struct 声明 定义
#include<stdio.h>
int main(void){
//define struct method 1
struct Node{
int a;
int b;
char str;
};
struct Node myNode;
myNode.a = 100;
myNode.b = 200;
myNode.str = 'A';
printf("method1 a=%d,b=%d,str=%d \n ", myNode.a , myNode.b,myNode.str);
//define struct method 2
struct Node2{
int a;
int b;
char str;
}myNode2={101,201,'B'},
myNode3={102,202,'C'};
printf("method2 myNode2 a=%d,b=%d,str=%d \n ", myNode2.a , myNode2.b,myNode2.str);
printf("method2 myNode3 a=%d,b=%d,str=%d \n ", myNode3.a , myNode3.b,myNode3.str);
//define strcut method3
typedef struct {
int a;
int b;
char str;
}Node3;
Node3 myNode4 = {104,205,'D'};
printf("method3 a=%d,b=%d,str=%d \n ", myNode4.a , myNode4.b, myNode4.str);
}
c与cpp struct声明 定义 区别:http://www.cnblogs.com/scotth/p/3843272.html

时间复杂度(平均,最坏情况)、
空间复杂度、
稳定性、
都是我们选择排序算法需要考虑的
-
(二叉)堆是一个数组,它可以看成一个近似的 完全二叉树。
-
堆排序,归并排序 都是渐优的比较排序算法, 时间复杂度是 O(n logn).
-
桶排序,时间复杂度最低, 但是对于数值大的数m, 浪费的空间太多。时间复杂度:O(n),空间复杂度:O(m), 原理:将值为i的元素放入i号桶,最后依次倒出。
-
实际情况中 快排 效率最高,因为它的平均性能比较好。平均期望时间复杂度是 O(n lgn),最坏时间复杂度是 O( n^2 ),而且O(n lgn)中隐含的常数因子非常小。
ADT 抽象数据类型(abstract data type)
-
表
- 如果用数组方式实现,内存连续,插入、删除最坏时间复杂度是O(n)
- 如果在位置0,插入一个元素,则后面所有的元素都需要后移一个位置
- 如果在位置0,删除一个元素,则后面所有的元素都需要前移一个位置
- 如果用数组方式实现,内存连续,插入、删除最坏时间复杂度是O(n)
-
链表
- 内存不连续
- 插入、删除 时间复杂度是O(1)
关于链表 插入,删除, 创建,是否为空,
#ifndef _List_H_
struct Node;
typedef struct Node *Ptr2Node;//定义一个Node 结构体类型的 指针
typedef Ptr2Node List; //创建一个静态Node对象
typedef Ptr2Node Positon; //
List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P, List L);
Position Find(ElementType X, List L);
void Delete(ElementType X, List L);
Position FindPrevious(ElementType X, List L);
void Insert(ElementType X, List L, Position P);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
Position Advance(Position P);
ElementType Retrieve(Position P);
#endif /*_List_H*/
/*Place in the implementation file*/
struct Node{
ElementType Element;
Position Next;
}
//链表代码的 具体实现,《数据结构与算法分析----c语言描述》2nd Mark Allen Weiss著 p35
//这里不多说
-
循环链表(首尾相接)
-
双向链表
一些问题的思考:
- 链表倒序
- 单向链表:【表尾】改成【表头】,next,依次改变, 1234->4321
- 双向链表:略
不管什么链表,画个图,就很清晰。
栈
只需要记得 LIFO, FILO,
//栈代码 具体实现,《数据结构与算法分析----c语言描述》2nd Mark Allen Weiss著 p47
队列
常应用于排队的场合。
双向队列
hash
树
- 二叉搜索树(binary search tree)
二叉搜索树的基本操作 花费的时间 与这棵树的高度成正比。
对于有n个节点的一棵完全二叉树来说,最坏运行时间为O(lg n)。然而,如果这棵树是一条n个节点组成的线性链,那么同样的操作 就要花费O(n)的最坏运行时间。
- 查询二叉搜索树
O(*h*)时间内,执行`MINIMUM` `MAXIMUM` `SUCCESSOR` `PREDECESSOR` 查询操作。
typedef struct TreeNode *Ptr2Node;
typedef struct Ptr2Node Tree;
struct TreeNode{
ElementType Element;
Tree Left;
Tree Right;
}
//树代码 具体实现,《数据结构与算法分析----c语言描述》2nd Mark Allen Weiss著 p75
- AVL (Adelson-Velskii 和Landis )树是带有平衡条件的二叉查找树
必须保持平衡,保证树的深度 为O(log N), 最简单的想法是 左右子树 有相同的高度。
- 树的遍历
前序
中序
后序
void PrintTree(SearchTree T){ //按顺序打印二叉查找树 的case
if(T!= NULL){
PrintTree(T->Left);
PrintElement(T->Element);
PrintTree(T->Right);
}
}
- B-树 : SBL 平衡 搜索树
适用于 二级(磁盘) 存储器上的数据库维护
Average WorstCase
Space O(n) O(n)
Search O(log n) O(log n)
Insert O(log n) O(log n)
Delete O(log n) O(log n)
阶为M的B-树 具有下列结构特性:
- 树的根 或者是一片树叶,或者其儿子 数 在2和M之间
- 除根外,所有的非树叶节点的儿子数 在[M/2]和M之间
- 所有的树叶 都在相同的深度上
-
红黑树 (red-black tree)
是许多平衡树的一种,可以保证在最坏情况下 基本动态集合 操作的时间复杂度是O(lg n);

浙公网安备 33010602011771号