大话数据结构——烂笔头
1. 基本概念
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
程序设计=数据结构+算法
1.1 数据
“巧妇难为无米之炊”,有“米”才可以干活。“米”就为数据。
数据:是描述客观事物的符号,是计算机中可以操作的对象,使能被计算机识别,并输入给计算机处理的符号集合。
对于整型、实型等数值类型,可以进行数值计算。
对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。
数据元素
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
- 人类:人
- 畜类:牛、马、羊、猪。。。
数据项
数据项:一个数据元素可以由若干个数据项组成。是数据不可分割的最小单位。
- 人:眼、鼻、耳
数据对象
数据对象:是性质相同的数据元素的集合,是数据的子集。
1.2 数据结构
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
按照观点的不同,把数据结构分为逻辑结构和物理结构。
逻辑结构
逻辑结构:是数据对象中数据元素之间的相互关系。逻辑结构分为以下四种:
1. 集合结构
集合结构:集合结构中的数据元素除了同属于一个集合外,他们之间没有任何其他关系。各个数据元素是“平等”的。
2. 线性结构
线性结构:线性结构中的数据元素之间是一对一的关系。
3. 树形结构
树形结构:树形结构中的数据元素之间存在一中一对多的层次关系。
4. 图形结构
图形结构:图形结构的数据元素是多对多的关系。
在用示意图表示数据的逻辑结构时,需要注意:
- 将每一个数据元素看做一个结点,用圆圈表示。
- 元素之间的逻辑关系用结点之间的连线表示,如果和这个关系是有方向的,那么用带箭头的连线表示。
物理结构
物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据元素的存储结构形式有两种:顺序存储和链式存储。
1. 顺序存储结构
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
2. 链式存储结构
链式存储结构:是把数据元素存在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
数据存在那里不重要,只要有一个指针存放了相应的地址就能找到它了。
1.3 数据类型
数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
原子类型:是不可以再分解的基本类型,包括整型、实型、字符型等。
结构类型:是由若干个类型组合而成,是可以再分解的。
抽象是指抽取出事物具有的普遍的本质。
抽象数据类型(Abstract Data Type,ADT):是指一个数学模型及定义在该模型上的一组操作。
“抽象”的意义在于数据类型的数学抽象特性。
描述抽象数据类型的标准格式:
ADT 抽象数据类型名
Data数据元素之间逻辑关系的定义
Operation操作 1初始条件操作结果描述操作 2.... 操作 n....
endADT
1.4 总结回顾
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
2. 算法
算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
2.1 数据结构与算法的关系
梁山伯与祝英台
罗密欧和朱丽叶
2.2 两种算法的比较
1+2+3+·······100结果:
无脑写,随便写
int i, sum=0, n=100
for(i=1;i<n;i++){sum=sum+i;
}
printf("%d",sum);
天才高斯
用程序来实现如下:
int i,sum=0,n=100;
sum=(1+100)*n/2;
printf("%d",sum);
得:人脑比电脑快。
2.3 算法的定义
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
没有通用的算法,就像没有包治百病的药!
理解万岁
指令能被人或机器等计算装置执行。它可以是计算机指令,也可以是我们平时的语言文字。
为解决某个或某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每一个操作都完成特定的功能,这就是算法了。
2.4 算法的特性
算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。
- 输入输出
算法具有零个或多个输入。算法至少有一个或多个输出。 - 有穷性
有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
这里的有穷不是纯数学意义的,而是在实际应用中合理的、可以接受的“有边界”。你说你写一个算法,需要算个二十年,一定会结束,它在数学意义上是有穷了,可是媳妇都熬成婆了,算法的意义也就不大了。
- 确定性
确定性:算法的每一步骤都具有确定的含义,不会出现二义性。 - 可行性
可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限的次数完成。
2.5 算法设计的要求
- 正确性
正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
算法的“正确”通常在用法上有很大的差别,大体分为以下四个层次- 算法程序没有语法错误
- 算法程序对于合法的输入数据能够产生满足要求的输出结果。
- 算法程序对于非法的输入数据能够得出满足规格说明的结果。
- 算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。
- 可读性
可读性:算法设计的另一目的是为了便于阅读、理解和交流。
可读性是算法好坏很重要的标志。
- 健壮性
一个好的算法还应该能对输入数据不合法的情况做合适的处理。比如输入的时间或者距离不应该是负数等。
健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名奇妙的结果 - 时间效率高和存储量低
人:花最少的钱,用最短的时间,办最大的事!
算法:用最少的存储空间,花最少的时间,办成同样的事就是好算法。
2.6 算法效率的度量方法
正所谓“是骡子是马,拉出来遛遛”。通过对算法的测试,计算不同算法的效率是高还是低。
- 事后统计方法
事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不通算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
不好用 - 事前分析估算方法
事前分析估算法:在计算机程序编制前,依据统计方法对算法进行估算。
程序消耗时间取决于下列因素:- 算法采用的策略、方法。
- 编译产生的代码质量。
- 问题的输入规模
- 机器执行指令的速度。
第一条当然是算法好坏的根本,第二条要由软件来支持,第四条要看硬件性能。也就是说,抛开这些与计算机硬件、软件有关的因素,**一个程序的运行时间,依赖于算法的好坏和问题的输入规模。**所谓问题输入规模是指输入量的多少。
2.7 函数的渐近增长
函数的渐近增长:给定连个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐近快于g(n)。
2.9 算数时间复杂度
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和发f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
推导大O阶方法
- 用常数1取代运行时间中的所有加法常数。
- 保留最高阶项
- 存在最高阶项且不是1,去除这个项的常数。
常用的时间复杂度从小到大排序:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
2.10 最坏情况与平均情况
最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最重要的需求,通常,除非特别指定,我们提高的运行时间都是最坏情况的运行时间。
平均运行时间是所有情况中最有意义的,因为他是期望的运行时间。
对算法的分析,一种方法是计算所有情况的平均值,这种时间复杂度的计算方法称为平均时间复杂度。另一种方法是计算最坏情况下的时间复杂度,这种方法称为最坏时间复杂度
*一般在没有特殊说明的情况下,都是指最坏时间复杂度
2.11 算法空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:**S(n)=O(f(n))**其中,n为问题规模,f(n)为语句关于n所占存储空间的函数。
3 线性表
线性表(List):零个或多个数据元素的有限序列。
线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。
大话数据结构——烂笔头相关推荐
- 微软为华为定制了一个“烂笔头小冰”,让人想起了老罗的“闪念胶囊”
微软全球执行副总裁--沈向洋 在刚刚过去的第六代小冰发布会上,微软和华为走到了一起. 小冰产品总监徐翔宣布,微软小冰将于今日上线华为手机,所有升级至智能助手 8.2 版本及以上的华为手机(包括华为和荣 ...
- 进来在看《How Tomcat Works》这本书,将读书笔记贴在这里,好记性不如烂笔头。
进来在看<How Tomcat Works>这本书,将读书笔记贴在这里,好记性不如烂笔头. 最简单的一个服务器,一个很简单的结果. HttpServer构建ServerSocket,每 ...
- 啥都不如烂笔头,约翰霍普金斯大学新研究:学外语还得用手写
荣伟 发自 凹非寺 报道 | 公众号 QbitAI "数字时代,也别丢了纸和笔!" 一位约翰霍普金斯大学教授如是呼吁. 之所以会有这样的忠告,是因为他在最近一项研究中发现: 在学习 ...
- 大话数据结构-栈与队列
文章知识点来至于大话数据结构里边章节知识, 这篇主要介绍栈与队列在计算机中存储形式, 以及在某些算法领域中对栈和队列的相关应用.章节最后介绍了著名的逆波兰表达式, 以及通过算法来实现该表达式的运算过程 ...
- 好记性不如烂笔头:会议纪要本
开发的大多数经历都用在思考代码如何写上,当你在进行某个项目时,突然开会又说要弄其他的项目,或者又是新的需求,需求错综复杂,多个项目交织在一起的时候容易乱. 开会时需要一个会议纪要本,会上讲了哪些关于你 ...
- 《大话数据结构》读书笔记-查找
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 8.1 开场白 8.2 查找概论 8. ...
- 《大话数据结构》读书笔记-图
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 7.2 图的定义 7.2.1 各种图定 ...
- 《大话数据结构》读书笔记-串
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 5.2 串的定义 5.3串的比较 5.4串的抽象数据类型 5 ...
- 《大话数据结构》读书笔记-栈与队列
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...
- 《大话数据结构》读书笔记-线性表
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 ...
最新文章
- Android Loader机制全面详解及源码浅析
- 剖析boot.img的制作流程
- Docker容器间通讯,直接路由方式实现网络通讯
- NJUST1712(形成三角形面积为整数的个数)
- oracle Merge 函数
- python 八大排序_八大排序算法的 Python 实现
- zabbix监控vsftp服务,发生故障并自动恢复
- 支付验证签名失败_验证码收不到,或许是验证码平台出了问题!
- 奇人有奇书(李渔、张岱、陈继儒、吴敬梓)
- CISA已遭利用漏洞列表新增15个漏洞
- 绝对定位实现漂浮工具条停靠在内容旁边
- LIO-SAM探秘第三章之代码解析(二) --- featureExtraction.cpp
- 如何自动申请京东试用商品、签到获取京豆
- 中国志愿者服务器注册,如何注册成为志愿者?中国志愿服务网注册流程
- 《计算机建筑绘图》在线考试,《建筑制图与识图》在线开放课程开讲了
- Ubuntu连接不上网络问题的解决方法
- 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
- “三天打鱼两天晒网问题
- 图书销售管理系统的设计与实现
- Selenium Webdriver 的使用java执行js代码 解决 ScriptEngine不支持浏览器内置对象window,document的问题
热门文章
- 过年回家,还怕抢不到票?程序员教你如何抢票
- 趣味ACM题 圣骑士的斩杀
- 1-8代酷睿全部中招,英特尔处理器再曝漏洞
- 剑指Offer读书笔记(持续更新中)
- 苹果ipad基本使用方法,苹果ipad的使用方法
- ValueError: tile cannot extend outside image
- java正则表达式获取书名
- chm文档已取消到该网页的导航的解决方法
- Oracle字符串操作[转:http://www.cnblogs.com/xd502djj/archive/2010/08/11/1797577.html]
- 智慧经营误区为何很多人还在执迷不悟?