zoukankan      html  css  js  c++  java
  • 数据结构总结

    计算机组成原理
    计算机网络
    数据结构和算法
    推荐书籍:
    清华大学 严蔚敏 数据结构和算法(Java)
    程杰 大话数据结构
    哈佛大学 cs50


    #一、数据结构的重要性

    #二、数据结构的定义
    将现实中的大量并且复杂的问题以特定的数据类型和特定的存储结构
    保存在相应的主存储器(内存)中
    以及在此基础上为实现的特定功能而执行的相应操作,该相应操作就是算法。
    -----------------------------
    |数据结构=个体+个体关系 |
    |算法==对存储的数据进行的操作 |
    -----------------------------
    数据结构:
    狭义:
    数据结构就是为了研究数据的存储问题
    数据结构的存储包含:个体的存储+个体关系的存储

    广义:
    数据结构即包含对数据的存储,也包含对数据的操作
    对存储数据的操作就是算法

    算法:
    狭义:
    算法是和数据的存储方式有关
    广义:
    算法和数据的存储方式无关,这是c++的泛型的思想(运算符重载)


    #三、算法
    衡量算法的标准:时间复杂度,空间复杂度,健壮性,难易程度
    ##(1)时间复杂度O:程序执行次数
    用途:评估算法执行效率
    为什么不用执行时间?
    不同类型的计算机执行同一程序用的时间可能不一样
    常见时间复杂度(按效率排序):
    O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^2logn) < O(n^3)
    常数阶 对数阶 线性阶
    判断时间复杂度的技巧:
    循环减半O(logn),二分查找就是O(logn)
    几层循环就是n的几此方的复杂度

    ##1、排序算法
    lowB三人组:
    选择排序O(n^2)
    冒泡排序O(n^2)
    插入排序
    NB三人组:
    快速排序O(nlogn)

    ##2.查找算法
    顺序查找
    二分查找O(logn)


    #四、线性结构
    一个整型4个字节,一个字节8个bit,因此一个整型32bit
    ##1.连续存储
    数组(连续)
    优点:存储熟读快
    缺点:实现需要知道数组的长度
    需要大块的连续内存空间
    插入、删除非常慢,效率低

    ##2.离散存储
    链表(不连续)
    (1)定义
    n个节点离散分配
    彼此通过指针相连
    每个节点只有一个前驱节点,每个节点只有一个后续节点
    首节点没有前驱节点,尾节点没有后续节点
    (2)优点:空间没有限制,插入或删除元素快
    缺点:查询慢
    专业术语:
    头结点:第一个有效节点之前的节点,头结点不存储任何数据,通过判断头结点的指针域是否为None,来判断链表是否为空
    首节点:第一个有效节点
    尾节点:最后一个有效节点,尾节点的指针域为None
    头指针:指向头结点的指针变量
    尾指针:指向尾节点的指针变量
    链表分类:
    单向链表
    双向链表(每个节点有两个指针域)
    循环链表(能通过任何一个节点找到其他所有节点)
    非循环链表

    ##3.约瑟夫问题(循环链表)
    构造循环链表是重中之重
    for i in range(4):
    child = Child(i + 1) # 实例化新的孩子

    if i == 0: # 如果是
    self.first = child
    child.pNext = self.first
    cur = self.first
    else:
    cur.pNext = child
    child.pNext = self.first
    cur = cur.pNext
    递归(递归过多会导致栈溢出)
    队列(先进先出,FIO)

    ##4.线性结构的两种应用方式:
    1.队列(先进先出)
    队列分类:
    动态队列(链式队列)
    静态队列
    所有和时间有关的操作都和队列有关

    2.栈(先进后出,只能操作顶部的数据)
    压栈push
    出栈pop
    函数的底层执行原理,是先一层层压栈,当我们执行规模减少时就出栈,直到栈空就是执行完毕
    分类:
    1.静态栈
    核心是数组(固定的分配内存),
    2.动态栈
    核心是链表()
    栈的算法:
    栈操作的是一个个节点
    栈有初始化、压栈、出栈、判空、遍历、清空
    栈的应用:
    函数调用
    中断
    表达式求值
    内存分配
    走迷宫
    ##递归
    定义:一个函数自己调自己或者间接调用自己
    多个函数调用:
    当多个函数调用时,按照“先调用后返回”的原则,函数之间的信息传递和控制转移必须借助栈实现,
    即系统将整个程序运行所需要的数据空间安排在一个栈中,每当调用函数时,就在栈顶分配一个存储区,进行
    压栈操作,每当一个函数退出,就释放它的存储区,即进行出栈操作,当前运行的函数永远在栈顶位置。
    满足条件:
    (1)必须有明确的终止条件
    (2)处理的数据规模必须是递减的
    (3)这个转化必须是可解的
    递归与循环的区别:
    递归不易理解,速度慢,存储空间大
    循环易理解,速度快,存储空间小
    应用:
    很多数学公式的实现


    #五、非线性结构
    ##森林:n个互不相交的数的集合。
    ##树
    定义:
    树是由节点和边组成
    每个节点只能有一个父节点,但是可以有多个节点。根节点就没有父节点。
    专业术语:
    度:子节点个数
    叶子结点:没有子节点的节点
    深度:从根节点到最底层节点的层数,根节点是第一层
    树的分类:
    一般树:任意一个节点的子节点的个数不受限制
    二叉树(满二叉树是完全二叉树的特殊情况,完全二叉树不一定是满二叉树)
    定义:任意一个节点的子节点的个数最多是两个,且子节点的位置不可更改
    满二叉树:在不增加层数的前提下,无法再多添加一个节点的二叉树
    完全二叉树:只是删除了满二叉树最底层最右边连续的若干个节点
    一般二叉树:
    树的应用:
    树是数据库中数据组织的重要形式
    操作系统子父进程的关系本身就是一棵树
    面向对象语言中类的继承关系

  • 相关阅读:
    WCF-配置
    乡下人生活录——程序员给自己买份保险吧
    Sqlserver表分区
    Oracle通过Navicat导入表数据与机构,数据无法直接查询,需要加双引号的问题
    19.Imagetragick 命令执行漏洞(CVE-2016–3714)
    18.phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
    17.[CVE-2017-12615]Tomcat任意文件上传漏洞
    16.Tomcat弱口令 && 后台getshell漏洞
    15.Nginx 解析漏洞复现
    14.Nginx 文件名逻辑漏洞(CVE-2013-4547)
  • 原文地址:https://www.cnblogs.com/maojiang/p/9605313.html
Copyright © 2011-2022 走看看