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

    数据结构定义

    我们如何把现实中大量而且非常复杂的问题以特定的数据类型(个体)和特定的存储结构(个体的关系)保存到相应的主存储器(内容)中,以及在此基础上为实现某个功能而执行的相应操作,这个相应的操作也叫做算法

    数据结构==个体+个体的关系

    算法==对存储数据的操作

    数据结构的特点

    数据结构是软件中最核心的课程

    程序=数据的存储+数据的操作+可以而被计算机执行的语言

    线性结构

    把所有的节点用一根线串起来

    数组和链表的区别

    数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。 而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。

    连续存储(数组)

    数组,在其python中称为列表,是一种基本的数据结构类型

    查询的时间复杂度O(1)

    修改删除的时间复杂度O(n)

    数组的优点:

    1. 存取速度快

    缺点:

    事先需要知道数组的长度

    需要大块的连续内存

    插入删除非常的慢,效率极低

    离散存储(链表)

    定义:

    1. n个节点离散分配
    2. 彼此通过指针相连
    3. 每个节点只有一个前驱节点,每个节点只有一个后续节点
    4. 首节点没有前驱节点,尾节点没有后续节点

    优点:

    1. 空间没有限制,插入删除元素很快

    缺点:

    1. 查询较比慢

    链表的节点结构


    单链表.jpg

     data为自定义的数据,next为下一个节点的地址

    专业术语:

    1. 首节点:第一个有效节点
    2. 尾节点:最后一个有效节点
    3. 头结点:第一个有效节点之前的那个节点,头节点并不存储任何数据,目的是为了方便对链表的操作
    4. 头指针:指向头节点的指针变量
    5. 尾指针:指向尾节点的指针变量

    链表的分类:

    1. 单链表
    2. 双链表,每一个节点有两个指针域
    3. 循环链表,能通过任何一个节点找到其他所有的节点
    4. 非循环链表

    算法:

    • 增加
    • 删除
    • 修改
    • 查找
    • 总长度

    单链表的算法

    class Hero(object):
        def __init__(self, no=None, name=None, nickname=None, pNext=None):
            self.no = no
            self.name = name
            self.nickname = nickname
            self.pNext = pNext
    
    def add(head, hero):
        ### 后面添加
        # head.pNext = hero
    
        cur = head
        # print(id(cur), id(head))
        while cur.pNext != None:
            if cur.pNext.no > hero.no:
               break
            cur = cur.pNext
        hero.pNext = cur.pNext
        cur.pNext = hero
        # print(id(cur), id(head))
    
    def showAll(head):
        cur = head
        while cur.pNext != None:
            cur = cur.pNext
            print(cur.no, cur.name)
    
    
    def delHero(head, no):
        cur = head
    
        while cur.pNext != None:
            if cur.pNext.no == no:
                break
            cur = cur.pNext   ### cur += 1
    
        cur.pNext = cur.pNext.pNext
    
    
    
    
    head = Hero()
    h1 = Hero(1, 'h1', '及时雨')
    add(head, h1)
    
    h2 = Hero(2, 'h2', '玉麒麟')
    add(head, h2)
    
    h4 = Hero(4, 'h3', '智多星')
    add(head, h4)
    
    h3 = Hero(3, 'h4', '智多星')
    add(head, h3)
    
    showAll(head)

    数组和链表的性能比较

    栈的定义

    一种可以实现"先进后出"的存储结构

    栈类似于一个箱子,先放进去的书,最后才能取出来,同理,后放进去的书,先取出来

    栈的分类

    静态栈:静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作其栈顶元素

    动态栈:动态栈的核心是链表

     栈的算法

    栈的算法主要是压栈和出栈两种操作的算法

    理解思路:

    • 栈操作的是一个个节点
    • 栈本身也是一种存储的数据结构
    • 栈有初始化,压栈,出栈,判空,遍历,清空等主要方法

     栈的应用

    函数的调用

    浏览器的前进和后退

    表达式求值

    内存分配

    树的定义

    我们可以简单的认为:

    • 树有且仅有一个根节点
    • 有若干个互不相交的子树,这些子树本身也是一颗树

    通俗的定义:

    • 树就是由节点和边组成的
    • 每一个节点只能有一个父节点,但可以有多个子节点,但有一个节点例外,该节点没有父节点,此节点就称为根节点

    树的专业术语

    节点

    父节点

    子节点

    子孙

    堂兄弟

    兄弟

    深度:从根节点到最底层节点的层数被称为深度,根节点是第一层

    叶子节点:没有子节点的节点

    度:子节点的个数

    树的分类

    一般树:任意一个节点的子节点的个数不受限制

    二叉树:

    • 定义:任意一个节点的子节点的个数最多是两个,且子节点的位置不可更改

    满二叉树:

    • 定义:在不增加层数的前提下,无法再多添加一个节点的二叉树

    完全二叉树:

    • 定义:只是删除了满二叉树最底层最右边连续的若干个节点

    一般二叉树

    森林:n个互不相交的数的集合

     树的操作

    把一个非线性的结构数据转换成一个线性结构的数据存储起来

    一般树的存储

    • 双亲表示法:求父节点方便
    • 孩子表示法:求子节点方便
    • 双亲孩子表示法:求父节点和子节点都很方便
    • 二叉树表示法
    1. 即把一般树转换成二叉树,按照二叉树的方式进行存储
    2. 具体的转化办法:
      • 设法保证任意一个节点的左指针指向它的第一个孩子
      • 设法保证任意一个节点的右指针指向它的下一个兄弟
      • 只要能满足上述的条件就能够转化成功

     二叉树的操作

    连续存储(完全二叉树,数组方式进行存储)

    • 优点:查找某个节点的父节点和子节点非常的快
    • 缺点:耗用内存空间过大
    • 转化的方法:先序,中序,后序

    链式存储(链表存储)

    • data区域,左孩子区域,右孩子区域

    森林的操作

    • 把所有的数转化成二叉树,方法同一般树的转化

    二叉树具体的操作

    1.二叉树的先序遍历(先访问根节点)

    先访问根节点

    再先序遍历左子树

    再先序遍历右子树

    2.二叉树的中序遍历(中间访问根节点)

    先中序遍历左子树

    再访问根节点

    再中序遍历右子树

    3.二叉树的后序遍历(最后访问根节点)

    先中序遍历左子树

    再中序遍历右子树

    再访问根节点

    4.已知先序和中序,求出后序

    #### 例一
    先序:ABCDEFGH
    中序:BDCEAFHG
    求后序?
    后序:DECBHGFA
    #### 例二
    先序:ABDGHCEFI
    中序:GDHBAECIF
    求后序?
    后序:GHDBEIFCA

    5.已知中序和后序,求出先序

    中序:BDCEAFHG
    后序:DECBHGFA
    求先序?
    先序:ABCDEFGH

    树的应用

    树是数据库中数据组织的一种重要形式

    操作系统子父进程的关系本身就是一颗树

    面向对象语言中类的继承关系

  • 相关阅读:
    winform 调用http 通过代理出现的一系列问题
    【转】 CSS3阴影 box-shadow的使用和技巧总结
    【转】 C#程序以管理员权限运行
    【转】WMI使用的WIN32_类库名
    【转】C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher
    【转】纯CSS设置Checkbox复选框控件的样式
    【转】vs2012 打包安装更改 setup.exe的图标
    【转】VS2012程序打包部署详解
    142. Linked List Cycle II
    141. Linked List Cycle
  • 原文地址:https://www.cnblogs.com/angelyan/p/10645441.html
Copyright © 2011-2022 走看看