数据结构概述(教材选用严蔚敏、吴伟民,该书程序是伪算法具体的程序是高一凡,西电的,大牛,只有程序。还有一本书,台湾的黄国瑜自己写的只有思路,程序是另外一个合作的清华的写的,可惜很多错的。)
学完数据结构之后会对面向过程的函数有一个更深的了解定义我们如何把现实中大量而复杂的问题以特定的数据类型(单个数据怎样存储?)和特定的存储结构(个体的关系) 保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫算法。(比如班里有15个人,其信息量也许一个数组就搞定了,但是假如10000个,怎么办?内存也许没有这么多连续的空间,所以我们改用链表,you see这就是与存储有关系。又比如,人事管理系统的信息存储,因为存在着上下级的关系,所以数组和链表就无能为力了,这时候我们用树,再比如我们做的是交通图,站和站之间肯定要连通,这时候以上的存储方式又无能为力了,所以我们又有了图。图就是每个结点都可以和其他结点产生联系。所以当我们要解决问题时,首先要解决的是如何把这些问题转换成数据,先保存到我们的主存中,)数据结构 = 个体 + 个体的关系算法 = 对存储数据的操作算法解题的方法和步骤衡量算法的标准1、时间复杂度大概程序要执行的次数,而非执行的时间。2、空间复杂度算法执行过程中大概所占用的最大内存3、难易程度(主要是应用方面看重)4、健壮性(不能别人给一个非法的输入就挂掉)数据结构的地位数据结构是软件中最核心的课程程序 = 数据的存储+数据的操作+可以被计算机执行的语言(已经提供)(学完数据结构,想用一种语言去实现它,必须有指针,数据结构java
版,就胡扯,变味,因为我们要讲链表,就是通过指针链在一起的。比如
在java中A aa = new A();本质上,aa是个地址)
预备知识指针指针的重要性:(内存是可以被CPU直接访问的,硬盘不行主要靠地址总线,数据总线,控制总线。)指针是C语言的灵魂定义地址地址就是内存单元的编号从0开始的非负整数范围:0--FFFFFFFF[0-4G-1](地址线是32位,刚好控制2的32次)指针:指针就是地址  地址就是指针指针变量是存放内存单元地址的变量指针的本质是一个操作受限的非负整数(不能加乘除,只能减)分类:1、基本类型的指针2、指针和数组的关系结构体(C++中用类也能实现)为什么会出现结构体为了表示一些复杂的数据,而普通的基本类型变量无法满足要求什么叫结构体结构体是用户根据实际需要自己定义的复合数据类型如何使用结构体两种方式:struct Student st = {1000, "zhangsan", 20}struct Student * pst = &st;1.st.sid2.pst->sidpst所指向的结构体变量中的sid这个成员注意事项:结构体变量不能加减乘除,但可以相互赋值普通结构体变量和结构体指针变量作为函数参数的传递(病毒就是靠访问正在运行的那些程序所占用的内存。Java中规定局部变量必须初始化,因为这些变量一开始都是垃圾值,但是属性不是必须初始化的,因为已经默认初始化为0)   动态内存分配和释放(动态分配的内存一定要手动释放,否则造成内存泄露。)
(java中A aa = new A();其实就是 A *p = (A *)malloc(sizeof(A)))模块一:线性结构【把所有的结点用一根直线穿起来】连续存储【数组】1、什么叫做数组元素类型相同,大小相等(数组传参,只要传进去首地址和长度就行)2、数组的优缺点:优点:存取速度快缺点:事先必须知道数组的长度插入删除元素很慢空间通常是有限制的需要大块连续的内存块插入删除元素的效率很低离散存储【链表】(我们搞底层的开发,类似于SUN公司的类)定义:n个节点离散分配彼此通过指针相连每个节点只有一个前驱节点,每个节点只有一个后续节点首节点没有前驱节点,尾节点没有后续节点。专业术语:首节点:第一个有效节点尾节点:最后一个有效节点头节点:头结点的数据类型和首节点的类型一样没有存放有效数据,最最前面的,是在首节点之前的,主要是为了方便对链表的操作。头指针:(指向头)指向头节点的指针变量尾指针:指向尾节点的指针(头结点有可能很大,占的内存可能大,假设我想造一个函数
输出所有链表的值,那你如果不用头指针类型做形参,那由于
不同链表的头节点不一样大小,这样就没办法找出形参)确定一个链表需要几个参数:(或者说如果期望一个函数对链表进行操作我们至少需要接收链表的那些信息???)只需要一个参数:头指针,因为通过它我们可以推出链表的所有信息。
(链表的程序最好一定要自己敲出来)分类:单链表双链表:每一个节点有两个指针域循环链表能通过任何一个节点找到其他所有的节点非循环链表(java中变成垃圾内存则会自动释放,但是C和C++则不会,所以要
手动释放,否则会引起内存泄露。delete等于free)        算法:遍历查找清空销毁求长度排序删除节点插入节点
算法:狭义的算法是与数据的存储方式密切相关广义的算法是与数据的存储方式无关泛型:(给你一种假象,只不过牛人从内部都弄好了)利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的算法的真正学法:很多算法你根本解决不了!!!!!!因为很多都属于数学上的东西,所以我们把答案找出来,如果能看懂就行,但是大部分人又看不懂,分三步,按照流程,语句,试数。这个过程肯定会不断地出错,所以不断出错,不断改错,这样反复敲很多次,才能有个提高。实在看不懂就先背会。                   链表的优缺点:优点:空间没有限制插入删除元素很快缺点:存取速度很慢。线性结构的两种常见应用之一   栈   (存储数据的结构)定义一种可以实现“先进后出” 的存储结构栈类似于箱子分类静态栈 (类似于用数组实现)动态栈 (类似于用链表实现)算法(往里放,从里取)出栈压栈(参看Java中线程的例子,成产消费的例子)应用函数调用中断表达式求值(用两个栈,一个存放数字,一个存放符号)内存分配缓冲处理迷宫线性结构的两种常见应用之二   队列定义:一种可是实现“先进先出”的存储结构分类:链式队列:用链表实现静态队列:用数组实现静态对流通常都必须是循环队列,为了减少内存浪费。循环队列的讲解:1、 静态队列为什么必须是循环队列2、  循环队列需要几个参数来确定 及其含义需要2个参数来确定frontrear3、 循环队列各个参数的含义2个参数不同场合不同的含义?    建议初学者先记住,然后慢慢体会1)队列初始化front和rear的值都是零2)队列非空front代表队列的第一个元素rear代表了最后一个有效元素的下一个元素3)队列空front和rear的值相等,但是不一定是零4、    循环队列入队伪算法讲解两步完成:1)将值存入r所代表的位置2)将r后移,正确写法是 rear = (rear+1)%数组长度错误写法:rear=rear+1;5、 循环队列出队伪算法讲解front = (front+1) % 数组长度6、 如何判断循环队列是否为空如果front与rear的值相等,则队列一定为空7、 如何判断循环队列是否已满预备知识:front的值和rear的值没有规律,即可以大,小,等。两种方式:1、多增加一个表标识的参数2、少用一个队列中的元素(才一个,不影响的)通常使用第二种方法如果r和f的值紧挨着,则队列已满用C语言伪算法表示就是:if( (r+1)%数组长度 == f )已满else不满队列算法:入队出队队列的具体应用:所有和事件有关的操作都有队列的影子。(例如操作系统认为先进来的先处理)专题:递归【这对你的编码能力是个质的飞跃,如果你想成为一个很厉害的程序员,数据结构是必须要掌握的,因为计算机专业的本科生也达不到这水平!计算机特别适合用递归的思想来解决问题,但是我们人类用递归的思想来考虑问题就会感到十分困扰,这也是很多学过递归的人一直都搞不明白的地方!那是不是递归可以随便写,当然不是,有些同学一用递归程序就死翘翘了。递归的思想是软件思想的基本思想之一,在树和图论上面,几乎全是用递归来实现的,最简单,像求阶乘这种没有明确执行次数的问题,都是用递归来解决】定义:一个函数自己直接或间接调用自己(一个函数调用另外一个函数和他调用自己是一模一样的,都是那三步,只不过在人看来有点诡异。)递归满足的三个条件:1、递归必须得有一个明确的终止条件2、该函数处理的数据规模必须在递减3、这个转化必须是可解的。循环和递归:理论上循环能解决的,肯定可以转化为递归,但是这个过程是复杂的数学转化过程,递归能解决不一定能转化为循环,我们初学者只要把经典的递归算法看懂就行,至于有没有能力运用看个人。       递归:易于理解速度慢存储空间大循环不易于理解速度快存储空间小举例:    1.求阶乘2.1+2+3+4+。。。+100的和3.汉诺塔【汉诺塔】这不是线性递归,这是非线性递归!n=1      1n=2      3n=3      7..................n=64     2的64次方减1【这是个天文数字,就算世界上最快的计算机也解决不了,汉诺塔的负责度是2的n次方减1】问题很复杂,但真正解决问题的编码只有三句。4.走迷宫(CS的实现)递归的运用:树和森林就是以递归的方式定义的树和图的很多算法都是以递归来实现的很多数学公式就是以递归的方式定义的斐波拉契序列1 2 3 5 8 13 21 34。。。为何数据结构难学:因为计算机内存是线性一维的,而我们要处理的数据
都是比较复杂的,那么怎么把这么多复杂的数据保存在计算机中来保存本
身就是一个难题,而计算机在保存线性结构的时候比较好理解,尤其是数
组和链表只不过是连续和离散的问题,线性结构是我们学习的重点,因为
线性算法比较成熟,无论C++还是Java中都有相关的工具例如Arraylist.
Linkedlist,但是在Java中没有树和图,因为非线性结构太复杂了,他的
操作远远大于线性结构的操作。即使SUN公司也没造出来。
小复习一下:^_^逻辑结构:(就是在你大脑里面能产生的,不考虑在计算机中存储)线性(用一根直线穿)在计算机中存储用:数组链表栈和队列是一种特殊的线性结构,是具体应用。(操作受限的线性结构,不受限的应该是在任何地方可以增删改查可以用数组和链表实现。只要把链表学会,栈和队列都能搞定,数组稍微复杂一些。)               非线性:树图物理结构:   数组链表          模块二:非线性结构(现在人类还没有造出一个容器,能把树和图都装进去的,因为他们确实是太复杂了)
(都要靠链表去实现)树树定义专业定义:1、有且只有一个称为根的节点2、有若干个互不相交的子树,这些子树本身也是一棵树通俗定义:1、树是由节点和边组成2、每个节点只有一个父节点但可以有多个子节点3、但有一个节点例外,该节点没有根节点,此节点称为根节点专业术语节点    父节点      子节点子孙    堂兄弟      深度:从根节点到最底层节点的层数称之为深度根节点是第一层叶子节点;(叶子就不能劈叉了)没有子节点的节点非终端节点:实际就是非叶子节点。根节点既可以是叶子也可以是非叶子节点度:子节点的个数称为度。(一棵树看最大的)         树分类:一般树任意一个节点的子节点的个数都不受限制二叉树(有序树)任意一个节点的子节点的个数最多两个,且子节点的位置不可更改。分类:一般二叉树满二叉树在不增加树的层数的前提下。无法再多添加一个节点的二叉树就是满二叉树。完全二叉树如果只是删除了满二叉树最底层最右边的连续若干个节点,这样形成的二叉树就是完全二叉树。森林n个互不相交的树的集合一般的二叉树要以数组的方式存储,要先转化成完全二叉树,因为如果你
只存有效节点(无论先序,中序,后序),则无法知道这个树的组成方式
是什么样子的。树的存储(都是转化成二叉树来存储)二叉树的存储连续存储【完全二叉树】优点:查找某个节点的父节点和子节点(也包括判断有咩有)速度很快缺点:耗用内存空间过大链式存储一般树的存储双亲表示法求父节点方便孩子表示法求子节点方便双亲孩子表示法求父节点和子节点都很方便二叉树表示法把一个普通树转化成二叉树来存储具体转换方法:设法保证任意一个节点的左指针域指向它的第一个孩子有指针域指向它的下一个兄弟只要能满足此条件,就可以把一个普通树转化成二叉树一个普通树转化成的二叉树一定没有右子树森林的存储先把森林转化为二叉树,再存储二叉树,具体方式为:根节点之间可以当成是兄弟来看待二叉树操作遍历先序遍历【先访问根节点】先访问根节点再先序访问左子树再先序访问右子树中序遍历【中间访问根节点】中序遍历左子树再访问根节点再中序遍历右子树后序遍历【最后访问根节点】先后序遍历左子树再后序遍历右子树再访问根节点已知两种遍历序列求原始二叉树 通过先序和中序 或者 中序和后续我们可以还原出原始的二叉树但是通过先序和后续是无法还原出原始的二叉树的换种说法:只有通过先序和中序, 或通过中序和后序我们才可以唯一的确定一个二叉树               应用树是数据库中数据组织的一种重要形式(例如图书馆的图书分类一层一层往下分。)操作系统子父进程的关系本身就是一棵树面向对象语言中类的继承关系本身就是一棵树赫夫曼树(树的一个特例)图模块三:查找和排序折半查找排序:冒泡插入选择快速排序归并排序排序和查找的关系排序是查找的前提排序是重点Java中容器和数据结构相关知识Iterator接口Map哈希表(与Java关系比较大)再次讨论什么是数据结构:数据结构研究是数据结构的存储和数据的操作的一门学问数据的存储分为两部分:个体的存储个体关系的存储从某个角度而言,数据的存储最核心的就是个体关系的存储,个体的存储可以忽略不计。再次讨论到底什么是泛型:同一种逻辑结构,无论该逻辑结构物理存储是什么样子的我们都可以对它执行相同的操作(例如都是线性结构或者用数组实现的树和用链表实现的树。利用重载技术。)    

数据结构_郝斌老师自学大纲相关推荐

  1. java郝斌_郝斌Java自学教程全集打包

    课程介绍: 1_Java概述_1 2_Java概述_2 3_Java概述_3 4_Java的卸载 5_Java的安装 6_环境变量的设置 7_常见dos命令 文件名和类名不同时编译运行的问题 8_变量 ...

  2. 《 郝斌 java自学视频 完结 》_《[郝斌]Java自学视频[完结]》AVI[压缩包]

    中文名: [郝斌]Java自学视频[完结]资源格式: 压缩包版本: AVI发行时间: 2009年地区: 大陆对白语言: 普通话文字语言: 简体中文简介: 特别说明: 视频原始来源为互联网,原始格式为F ...

  3. 郝斌老师C语言学习笔记(一)

    在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以"85"开头的很大的数字(此时该段内存中为一个垃圾 ...

  4. 郝斌老师-C语言视频教程(全180讲)

    <郝斌C语言自学教程>郝斌老师C语言自学专讲180集完整版 目录: 180_C期末考试测试题讲解 下 179_NULL的含义 178_C期末考试测试题讲解上 177_文件 宏 typede ...

  5. 郝斌c语言大纲百度云,C语言学习大纲 郝斌(讲解)

    教你如何快速掌握C语言,郝斌讲解,幽默而且加深了解.... 语言概述: 1.为什么学习C语言 1). C的起源和发展 2).C的特点 优点 代码量小 速度快 功能强大 缺点 危险性高 开发周期长 可移 ...

  6. 【郝斌老师数据结构学习笔记 day 3】

    目录 前言 一.连续存储数组的算法演示 二.typedef 的用法 总结 前言 数据结构的学习笔记,记录第三天 一.连续存储数组的算法演示 线性结构[把所有的结点用一根直线穿起来] 连续存储[数组] ...

  7. 【郝斌老师数据结构学习笔记 day 6】

    目录 前言 一.算法 二.几种常见存储结构浅析 三.非循环单链表算法演示合集 总结 前言 数据结构的学习笔记,记录第六天 一.算法 算法: 狭义:算法和数据的存储方式密切相关 广义:算法和数据的存储方 ...

  8. 【郝斌老师数据结构学习笔记 day 7】

    目录 前言 一.栈的定义 二.栈的分类 三.栈的一些算法 四.栈的日常应用 总结 前言 数据结构的学习笔记,记录第七天 一.栈的定义 定义:一种可以实现 "先进后出" 的存储结构 ...

  9. 程序基础:数据结构(郝斌讲解)(2)

    数据结构(五) 指针的知识. 指针的重要性 指针是c语言的灵魂 定义 地址:内存单元的编号. (内存是cpu唯一可以直接访问的大型存储器件,内存和cpu之间有三种线,地址线,控制线,地址线.) 从零开 ...

  10. 程序基础:数据结构(郝斌讲解)(一)

    开始写博客,目标一周一个项目总结,可能是一个具体的问题的求解方法,也可能是一周的学习笔记,还可能是一个算法的实现. 从2013年开始补起来 本周学习重点 数据结构 什么是数据结构? 数据结构概述:数据 ...

最新文章

  1. 如何重装计算机操作系统,自己如何重装笔记本电脑操作系统呢?
  2. 【css】报错,错误代码77,CURLE_SSL_CACERT_BADFILE (77)解决方法
  3. DFT实训教程笔记3(bibili版本)-SOC Scan Implementtation Scan Practice Session II
  4. 32GSSD组建RAID0后对硬盘的加速效果
  5. 安卓Selector
  6. java mvc tomcat_Java Servlet(七):JavaWeb MVC 操作(jdk7+tomcat7+eclipse)
  7. Android 10如何增强移动安全性
  8. bzoj 3994 约数个数和 —— 反演+数论分块
  9. 小程序入门学习11--云开发04
  10. JS延迟加载百度分享代码,提高网页速度
  11. Linux电源管理系统架构和驱动(1)-Linux电源管理全局架构
  12. VB中,连接ACCESS数据库
  13. 后台接收前台传来的图片并保存在本地
  14. wkhtmltopdf工具将网站转换成pdf或图片
  15. 第10章两个独立样本的t检验
  16. python一些常用函数
  17. Simulink与VREP联合仿真
  18. 保时捷遇最强对手?玛莎拉蒂发布全新SUV;比亚迪壳牌计划合资在深圳运营一万个电动汽车充电终端 | 美通社头条...
  19. 卸载ACE动态库导致句柄泄漏问题
  20. 2022年最新整理必背的Java面试题大全,背好了Offer在手

热门文章

  1. 高等数学(第七版)同济大学 习题1-8 个人解答
  2. 用Python制作小游戏之‘植物大战僵尸’(二)完整代码
  3. 西门子PLC多个CPU之间通讯简介
  4. 数据抓包+hijson
  5. python ray定时任务_python定时任务APScheduler
  6. Python定时任务框架APScheduler详解
  7. 基于Ubuntu系统下的Hadoop 环境搭建(新手可尝)
  8. 中国大学MOOC(慕课)离线下载视频支持电脑播放
  9. 快递鸟接口国内常用快递公司编码表
  10. 全国快递物流查询公司mysql数据库语句