1. 基本概念

数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
程序设计=数据结构+算法

1.1 数据

“巧妇难为无米之炊”,有“米”才可以干活。“米”就为数据。
数据:是描述客观事物的符号,是计算机中可以操作的对象,使能被计算机识别,并输入给计算机处理的符号集合。
对于整型、实型等数值类型,可以进行数值计算。
对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。

数据元素

数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。

  1. 人类:人
  2. 畜类:牛、马、羊、猪。。。

数据项

数据项:一个数据元素可以由若干个数据项组成。是数据不可分割的最小单位。

  • 人:眼、鼻、耳

数据对象

数据对象:是性质相同的数据元素的集合,是数据的子集。

1.2 数据结构

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

按照观点的不同,把数据结构分为逻辑结构物理结构

逻辑结构

逻辑结构:是数据对象中数据元素之间的相互关系。逻辑结构分为以下四种:

1. 集合结构

集合结构:集合结构中的数据元素除了同属于一个集合外,他们之间没有任何其他关系。各个数据元素是“平等”的。

2. 线性结构

线性结构:线性结构中的数据元素之间是一对一的关系。

3. 树形结构

树形结构:树形结构中的数据元素之间存在一中一对多的层次关系。

4. 图形结构

图形结构:图形结构的数据元素是多对多的关系。

在用示意图表示数据的逻辑结构时,需要注意:

  1. 将每一个数据元素看做一个结点,用圆圈表示。
  2. 元素之间的逻辑关系用结点之间的连线表示,如果和这个关系是有方向的,那么用带箭头的连线表示。

物理结构

物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据元素的存储结构形式有两种:顺序存储链式存储

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 算法的特性

算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。

  1. 输入输出
    算法具有零个或多个输入。算法至少有一个或多个输出。
  2. 有穷性
    有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。

这里的有穷不是纯数学意义的,而是在实际应用中合理的、可以接受的“有边界”。你说你写一个算法,需要算个二十年,一定会结束,它在数学意义上是有穷了,可是媳妇都熬成婆了,算法的意义也就不大了。

  1. 确定性
    确定性:算法的每一步骤都具有确定的含义,不会出现二义性。
  2. 可行性
    可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限的次数完成。

2.5 算法设计的要求

  1. 正确性
    正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
    算法的“正确”通常在用法上有很大的差别,大体分为以下四个层次

    1. 算法程序没有语法错误
    2. 算法程序对于合法的输入数据能够产生满足要求的输出结果。
    3. 算法程序对于非法的输入数据能够得出满足规格说明的结果。
    4. 算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。
  2. 可读性
    可读性:算法设计的另一目的是为了便于阅读、理解和交流。

可读性是算法好坏很重要的标志。

  1. 健壮性
    一个好的算法还应该能对输入数据不合法的情况做合适的处理。比如输入的时间或者距离不应该是负数等。
    健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名奇妙的结果
  2. 时间效率高和存储量低
    人:花最少的钱,用最短的时间,办最大的事!
    算法:用最少的存储空间,花最少的时间,办成同样的事就是好算法。

2.6 算法效率的度量方法

正所谓“是骡子是马,拉出来遛遛”。通过对算法的测试,计算不同算法的效率是高还是低。

  1. 事后统计方法
    事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不通算法编制的程序的运行时间进行比较,从而确定算法效率的高低。
    不好用
  2. 事前分析估算方法
    事前分析估算法:在计算机程序编制前,依据统计方法对算法进行估算。
    程序消耗时间取决于下列因素:

    1. 算法采用的策略、方法。
    2. 编译产生的代码质量。
    3. 问题的输入规模
    4. 机器执行指令的速度。
      第一条当然是算法好坏的根本,第二条要由软件来支持,第四条要看硬件性能。也就是说,抛开这些与计算机硬件、软件有关的因素,**一个程序的运行时间,依赖于算法的好坏和问题的输入规模。**所谓问题输入规模是指输入量的多少。

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取代运行时间中的所有加法常数。
  2. 保留最高阶项
  3. 存在最高阶项且不是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时,称为空表。

大话数据结构——烂笔头相关推荐

  1. 微软为华为定制了一个“烂笔头小冰”,让人想起了老罗的“闪念胶囊”

    微软全球执行副总裁--沈向洋 在刚刚过去的第六代小冰发布会上,微软和华为走到了一起. 小冰产品总监徐翔宣布,微软小冰将于今日上线华为手机,所有升级至智能助手 8.2 版本及以上的华为手机(包括华为和荣 ...

  2. 进来在看《How Tomcat Works》这本书,将读书笔记贴在这里,好记性不如烂笔头。

    进来在看<How Tomcat Works>这本书,将读书笔记贴在这里,好记性不如烂笔头.  最简单的一个服务器,一个很简单的结果.  HttpServer构建ServerSocket,每 ...

  3. 啥都不如烂笔头,约翰霍普金斯大学新研究:学外语还得用手写

    荣伟 发自 凹非寺 报道 | 公众号 QbitAI "数字时代,也别丢了纸和笔!" 一位约翰霍普金斯大学教授如是呼吁. 之所以会有这样的忠告,是因为他在最近一项研究中发现: 在学习 ...

  4. 大话数据结构-栈与队列

    文章知识点来至于大话数据结构里边章节知识, 这篇主要介绍栈与队列在计算机中存储形式, 以及在某些算法领域中对栈和队列的相关应用.章节最后介绍了著名的逆波兰表达式, 以及通过算法来实现该表达式的运算过程 ...

  5. 好记性不如烂笔头:会议纪要本

    开发的大多数经历都用在思考代码如何写上,当你在进行某个项目时,突然开会又说要弄其他的项目,或者又是新的需求,需求错综复杂,多个项目交织在一起的时候容易乱. 开会时需要一个会议纪要本,会上讲了哪些关于你 ...

  6. 《大话数据结构》读书笔记-查找

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 8.1 开场白 8.2 查找概论 8. ...

  7. 《大话数据结构》读书笔记-图

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 7.2 图的定义 7.2.1 各种图定 ...

  8. 《大话数据结构》读书笔记-串

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 5.2 串的定义 5.3串的比较 5.4串的抽象数据类型 5 ...

  9. 《大话数据结构》读书笔记-栈与队列

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...

  10. 《大话数据结构》读书笔记-线性表

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 ...

最新文章

  1. Android Loader机制全面详解及源码浅析
  2. 剖析boot.img的制作流程
  3. Docker容器间通讯,直接路由方式实现网络通讯
  4. NJUST1712(形成三角形面积为整数的个数)
  5. oracle Merge 函数
  6. python 八大排序_八大排序算法的 Python 实现
  7. zabbix监控vsftp服务,发生故障并自动恢复
  8. 支付验证签名失败_验证码收不到,或许是验证码平台出了问题!
  9. 奇人有奇书(李渔、张岱、陈继儒、吴敬梓)
  10. CISA已遭利用漏洞列表新增15个漏洞
  11. 绝对定位实现漂浮工具条停靠在内容旁边
  12. LIO-SAM探秘第三章之代码解析(二) --- featureExtraction.cpp
  13. 如何自动申请京东试用商品、签到获取京豆
  14. 中国志愿者服务器注册,如何注册成为志愿者?中国志愿服务网注册流程
  15. 《计算机建筑绘图》在线考试,《建筑制图与识图》在线开放课程开讲了
  16. Ubuntu连接不上网络问题的解决方法
  17. 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
  18. “三天打鱼两天晒网问题
  19. 图书销售管理系统的设计与实现
  20. Selenium Webdriver 的使用java执行js代码 解决 ScriptEngine不支持浏览器内置对象window,document的问题

热门文章

  1. 过年回家,还怕抢不到票?程序员教你如何抢票
  2. 趣味ACM题 圣骑士的斩杀
  3. 1-8代酷睿全部中招,英特尔处理器再曝漏洞
  4. 剑指Offer读书笔记(持续更新中)
  5. 苹果ipad基本使用方法,苹果ipad的使用方法
  6. ValueError: tile cannot extend outside image
  7. java正则表达式获取书名
  8. chm文档已取消到该网页的导航的解决方法
  9. Oracle字符串操作[转:http://www.cnblogs.com/xd502djj/archive/2010/08/11/1797577.html]
  10. 智慧经营误区为何很多人还在执迷不悟?