基础 数据结构

公式:某些无法用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


排序算法 us wiki
排序算法 中文wiki

时间复杂度(平均,最坏情况)、
空间复杂度、
稳定性、
都是我们选择排序算法需要考虑的

  • (二叉)堆是一个数组,它可以看成一个近似的 完全二叉树。
  • 堆排序,归并排序 都是渐优的比较排序算法, 时间复杂度是 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(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

MySQL索引背后的数据结构及算法原理 mooc地址

  • 二叉搜索树(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之间
- 所有的树叶 都在相同的深度上

  • B+树

  • 红黑树 (red-black tree)
    是许多平衡树的一种,可以保证在最坏情况下 基本动态集合 操作的时间复杂度是O(lg n);

posted @ 2015-10-26 15:07  scott_h  阅读(228)  评论(0)    收藏  举报