数据结构总结

链表

链表是一种由节点(Node)组成的线性数据集合,每个节点通过指针指针指向下一个节点。它是一种由节点组成,并能用于表示序列的数据结构。
单链表:每个节点仅指向下一个节点,最后一个节点指向空(null)
双链表:每个节点有两个指针p,n。p指向前一个节点,n指向下一个节点;最后一个节点指向空。
循环链表:每个节点指向下一个节点,最后一个节点指向第一个节点。
时间复杂度:
1.索引:O(n)
2.查找:O(n)
3.插入:O(1)
4.删除:O(1)
常规的删除算法思路:由于链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这样的话时间复杂度为O(n)。
但是如果我们直接找到要删除节点的下一个节点,不用遍历整个链表,只需把删除节点 i 的下一个节点 j 的内容复制到 i 上,然后把 i 的指针指向 j 的next,然后删除 j 节点,相当于删除了 i 节点,无需遍历整个链表,时间复杂度O(1)
插入算法思路:

1-140F9162221102.jpg

新节点的指针域指向 b ,老节点的指针域指向 x

栈是一种动态集合,它是一种LIFO(last in first out后进先出)结构
栈的实现:
(1)数组
(2)链表
栈要记录的数据:
(1)栈顶位置top
注意这个top有两种理解方式,一种是表示栈的最后一个数据的位置,另一种是表示栈的最后一个数据的下一个位置,这两种理解对栈的操作代码有一定的影响
(2)栈最大大小size
栈的操作:
(1)STACK_EMPTY():判断栈是否为空
(2)PUSH(X):向栈中添加一个值,注意栈是否为满的
(3)POP():从栈中弹出一个值,注意栈是否为空

image.png

队列

与栈不同,它是一种FIFO(first in first out先进先出)结构
队列的实现:
(1)数组
(2)链表
队列要记录的数据:
(1)队首位置head:第一个元素位置
(2)队尾位置tail:下一个元素要插入的位置(最后一个元素的下一个位置)
(3)队列最大大小size
队列的操作:
(1)ENQUEUE(x):入队
(2)DEQUEUE():出队
(3)EMPTY():队列为空,head=tail
(4)FULL():队列为满,head=(tail+1)%size

image.png

树的种类:
(1)二叉树
二叉树要存储4个数据,分别是节点携带的信息和其父节点、左右子节点的指针。
(2)分支无限制的有根树:
上面二叉树每个节点最多有两个子节点,而分支无限制的有根数则没有这个限制,可能有3个、5个甚至更多子节点。所以存储这种数据结构的问题在于我们事先并不知道应该设置多少个child指针,若设置的少了不能满足要求,设置的过多又会浪费空间。所以这里提出一种新的描述这种数据结构的方法——左孩子右兄弟表示法,这种方法每个节点设置3个指针:父指针、从左数第一个孩子的指针、其右侧相邻的兄弟指针,如下图所示

image.png

二叉查找树图示

堆实际上是以数组形式存储的二叉树
堆需要存储的数据:
(1)数组的大小max-size
(2)堆元素个数size,这里size要小于max-size
堆中元素通过坐标来确定父节点、左右子节点,具体来说:
一个节点i的父节点:[i/2]
一个节点i的左子节点:[i2]
一个节点i的右子节点:[i2+1]
堆的分类:
(1)最大堆
满足所有节点都比其父节点值小(小于等于)的堆
A[i/2]>=A[i]
(2)最小堆
满足所有节点都比其父节点值大(大于等于)的堆
A[i/2]<=A[i]
堆的操作:
(1)维护堆的性质(HEAPIFY)
这里指维护最大堆或最小堆的性质。假设一个数组中下标为i的节点的子节点满足最大(小)堆性质,但自身不一定满足这个性质,这时就需要HEAPIFY,具体来说是要比较这个节点和其两个子节点的大小,将其中的大(小)的和该节点位置交换,这样这个节点及其两个子节点就满足最大(小)堆的性质了,但是可能交换后子节点不满足堆的性质,所以这里要递归调用HEAPIFY,直到达到最下层节点,这样就维护了堆的性质。HEAPIFY耗时O(lgn)
(2)建堆(BUILD-HEAPIFY)
从中间那个元素开始到第一个元素,逐一调用HEAPIFY函数,即可完成建堆。
逐一从中间那个元素开始递减而不是从第一个元素递增,这时为了保证每次调用HEAPIFY都能保证该节点的子节点都满足最大(小)堆的性质,否则无法调用HEAPIFY。中间那个元素是第一个可能不满足最大(小)堆性质的节点,所以从这里开始维护(HEAPIFY)。一个建堆的例子如下所示:[5,3,17,10,84,19,6,22,9]

image.png

如何建一个最小堆,即将一个二叉树调整为最小堆?
[Heapify]http://www.lintcode.com/zh-cn/problem/heapify/
solution:堆实际上是以数组形式存储的二叉树(因此它的结构是固定的),有add插入操作(logn),poll弹出操作(logn),查看peek操作(O(1)),如果为minheap,则peek出来最小值,如果为maxheap,则peek出来最大值

@ O(n)
public class Solution {
    /*
     * @param A: Given an integer array
     * @return: nothing
     */
    public void heapify(int[] A) {
        // write your code here
        for (int i = A.length / 2; i >= 0; i--) {
            siftdown(A, i);
        } 
    }
    
    public void siftdown(int[] A, int k) {
        while(k < A.length) {
            int smallest = k;
            if (k * 2 + 1 < A.length && A[k * 2 + 1] < A[smallest]) {
                smallest = k * 2 + 1;
            }
            if (k * 2 + 2 < A.length && A[k * 2 + 2] < A[smallest]) {
                smallest = k * 2 + 2;
            }
            if (smallest == k) {
                break;
            }
            
            int temp = A[smallest];
            A[smallest] = A[k];
            A[k] = temp;
            
            k = smallest;
        }
    }
}

更容易理解的版本,siftup

@ O(nlogn)
public class Solution {
    /**
     * @param A: Given an integer array
     * @return: void
     */
    private void siftup(int[] A, int k) {
        while (k != 0) {
            int father = (k - 1) / 2;
            if (A[k] > A[father]) {
                break;
            }
            int temp = A[k];
            A[k] = A[father];
            A[father] = temp;
            
            k = father;
        }
    }
    
    public void heapify(int[] A) {
        for (int i = 0; i < A.length; i++) {
            siftup(A, i);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容