数据结构笔记(一)

  小提示: 不要"完美主义"把握好度

线性表:数组队列链表哈希表 
树:   
图:    

线性数据结构

数组

把数据码成一排进行存放     (在Java中对其存放元素有严格要求必须是相同数据类型)
    
 数组最好应用于"索引有语义"的情况

 栈  stack filo(先进后出)操作

* 特性:  
    1.栈也是一种线性结构
    2.相比与队列,栈队列是数组的子集
    3.只能从一端添加元素,从一端取出元素
    4.这一端称为栈顶(栈顶元素反应了在嵌套的层次关系中,最近的需要匹配的元素)如大小括号嵌套匹配关系
    
* 应用  
    1.撤销操作
    2.系统栈  
    3.括号匹配

队列:

* 普通队列 Queue  fifo(先进先出)操作

    1.队列也是一种线性结构(排成一排)
    2.相比于数组,队列对应的操作时数组的子集
    3.只能从一端(队尾)添加元素,只能从另一端(队首)取出元素(类似于生活当中的排队)

* 优先队列

    实现:
    1. heap(Binary,Binomial,Fib  nacci)
    2.Binary Search Tree

    应用:                                                                                                                                                                                       1.网络数据包的排队
    2.操作系统底层任务的排队
    3.广度优先遍历

* 二者区别:                                                                                                                                                                                 普通队列:先进先出;后进后出   
    优先队列:出队顺序与入队顺序无关;和优先级相关;可以动态的执行(操作系统调度任务)  应用 人工智能   

链表   LinkedList

注:LinkedList为双向链表

* 特点:

   1. 真正的动态数据结构  

   2. 最简单的动态数据结构  

   3. 采用引用(或者指针)及递归机制  

   4. 最后可以辅助成其它数据结构

* 实现:

    数据存储在"节点"(Node)中-->类似于火车的车厢 

    最后一个节点存储为NULL

    class Node{
        E e;
        Node next;
    }
    
* 数组优点:

   支持快速查询 数组最好用于索引有语义的情况

   真正的动态,不需要处理固定容量的问题

* 链表缺点:

   丧失了随机访问的能力 不适合用于索引有语义的情况

Hash 表 ( 散列表 ) 

    HashFuntion:  
    将要存储的值选取每一个字符的ASCII码相加%30 得到的数字将其存放到0~29的下标存放到相应的位置
    
    当得到的值相同时会发生Hash碰撞 可以在这个位置创立一个链表将重复的数字存放到该链表中(常用:拉链法 也可左放       右放)
    
    list 可重复 查找为O(n)插入删除更新O(1)
    映射(map)(key-value) hashmap treemap
    集合(set)(不可重复         可类似于map中的key value 用object占用) hashset hashmap

    hashtable的实现查找时间复杂度为O(1)但是无序
    增删改查平均时间复杂度为O(1) 最坏时间复杂度为O(n)
    
    binary-search-tree(二叉树)的实现查找时间为O(logn)但是排好序的相对有序
    增删改查平均时间复杂度为O(logn) 最坏时间复杂度为O(n)

堆:

Java 堆通常为Fibonacci堆  或平衡二叉树(红黑树)等

 curd效率最好为strict Fibonacci堆 Fibonacci堆 


树 

大部分为二叉树(本身是一种天然组织结构和链表一样,天然递归结构,动态数据结构) 空也是二叉树 可能退化为链表

 LinkedList 就是特殊化的Tree
 Tree就是特殊化的Graph

二叉搜索树(Binary Search Tree) 有序二叉树 排序二叉树  

性质:  

    1.左子树上所有单个节点的值均小于它的根节点的值
    2.右子树上所有单个节点的值均大于它的根节点的值
    3.左右子树也分别为二叉查找树

 遍历方式:

   1.前序遍历:总共三次访问第一次访问输出访问这个节点在访问该节点左右子树的之前(最自然的遍历方式,最常用的遍历方式)

   2.中序遍历:总共三次访问第二次访问输出访问这个节点在访问该节点左右子树的之间(先左后右)
      特点:结果是顺序的;

   3.后序遍历:总共三次访问第三次访问输出访问这个节点在访问该节点左右子树的之后(先左后右)
     应用:使用二分搜索树释放内存 

 注:

   删除任意元素可以通过Hibbard Delection 寻找到前驱或者后继进行取代待删除节点

   深度优先搜索DFS 栈 广度优先搜索BFS(如水滴波浪纹依次向外) 队列


三. 图:待定。。。


高级数据结构

集合 二分搜索树不能存放相同元素是非常好实现的"集合"的底层数据结构(应用:客户统计 词汇量统计)

1.有序集合基于搜索树实现   实现莫尔斯编码映射
2.无序集合基于哈希表实现  
3.多重集合可以基于允许重复元素二叉搜索树实现

映射 存储(键值)数据结构(key,value) 类似于字典的形式通过 单词映射释意和映射(Set 和Map)栈以及队列

1.映射map中的key是唯一的类似于 字典中的词条对应一个释意 (词频统计)

注:linkedList基于双向链表实现的 treeSet 基于红黑树实现的

* 平衡 二叉树 满二叉树除了叶子节点所有节点左右孩子都不为空
* 堆: 优先队列 二叉堆为完全二叉树  所有叶子节点往左侧集中 
* 最大堆 该节点的左右子树所有节点都小于该节点 节点的大小与所处的层次没有必然的联系

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值