时间:2019年6月22日22:26:24
从此开始记录学习数据结构的笔记,另外本人也是计算机初学者,如果您阅读到了发现了错误,欢迎各位指正。
书籍:
《数据结构》——严蔚敏
《大话数据结构》——程杰
视频:
C++基础视频教程扫地僧
1. 什么是数据结构?
数据额机构的起源
自计算机问世以来,计算机就得到了飞速的发展,从最早的计算机给人的感觉就是简单的计算数据解决一些简单的数据问题,如今计算机已深入到人类社会的各个领域中,从最简单的计算机解决一个具体问题,需要先抽象出一个适当的数据模型,然后设计相对应的算法,最后编出程序,得到最终答案。
然而更多非数值计算问题无法用数学模型来描述(例如:图书馆的索引,公公司里人物之间的关系),需要一种更有科学的手段来帮助,才能处理好这些问题,所以数据结构是研究非数值的数据与非数值的数据数据他们之间的关系和操作
1968年美国·欧·克努特教程开创了“数据结构”的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑解耦股和存储结构及操作的著作。到70年代,出现了大型程序,软件也相对独立,结构程序设计成为程序设计学的主要内容,人们就越来越重视“数据结构”,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。 当然这也是我们学习数据结构的目的
2. 基本概念和专业术语
数据:是指所有能输入到计算机中冰杯计算机程序处理的符号总称
int a = 0, b = 0;
数据对象:是性质相同的数据元素的集合,性质相同也就是说必须是同样的类型的集合,
int a[10];
数据元素:是数据的基本单元
a[1] a[2]
数据项:是组成数据元素的基本单元,一个数据元素可以有多个数据元素组成
什么是数据项呢,比如果C语言中的结构体,每一个成员就是这个数据元素的数据项
3. 数据逻辑结构
是指数据元素之间的逻辑关系,与数据在实际中存储无关
四类:
集合:集合结构中的数据元素,除了是同意属性外(类型),他们之间没有任何的关系
线性:线性结构中数据元素与元素之间是一对一关系
树:数据元素存在着一对多的关系
图:数据元素多对对关系
4. 数据物理结构
数据的物理结构是指数据的逻辑结构在计算机物理中实际表现的形式
2.0 算法
2.1 什么是算法?
简单的说,就是解决问题的方法和步骤
2.2 算法的5个重要特性
1)有穷性:一个算法执行有限的步骤后,会自动退出不会出现无限循环,并且每一个步骤都会在一定时间内完成
2)确定性:算法中每一条指令,不能产生二义性
3)可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成
4)输入:一个算法有零个或多个输入
5)输出:一个算法必须有一个或多个输出
2.3 算法设计的要求
1)正确性:指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
但是“正确”一词的含义在通常的用法中有很大差别,大体分为4个层次:
(1)算法程序没有语法错误
(2)算法程序对合法的输入数据能够产生满足要求的输出结果
(3)算法程序对于非法的输入数据能够得出满足规格说明的结构
(4)算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果
2)可读性:算法设计的另一个目的就是方便阅读、理解、交流。
3)健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果
4)效率与低存储量需求:算法的执行效率高,占用内存有低
2.4 算法效率的度量
算法执行时间需要通过依据该算法编制的程序在计算机上运行是所消耗的时间来度量,而度量一个程序的执行时间通常有两种方法
1)事后统计的方法
利用计算机对不同的算法编制的程序进行时间测试,从而选择占用时间最少的
缺点:
一:必须先运行算法编制的程序
二:所得时间的统计量依赖于计算机的硬件、软件等环境因素。
2)事前分析估算的方法:
分析一个算法所占用的时间,主要采取以下因素:
(1)算法采用的策略、方法。
(2)编译产生的代码质量
(3)问题的输入规模
(4)机器执行指令的速度
大O表示法
第一条是算法好坏的根本,第二条要由软件来支持,第四条要看硬件性能,也就是说,抛开这些计算机硬件、软件相关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题输入规模是指输入两的多少
int i, sum = 0, n = 100; /*执行了1次*/
for(i=0; i<=n; i++) /*执行了n+1次*/
{
sum += i; /*执行了n次*/
}
printf("sum = %d", sum); /*执行了1次*/
O(n^2)
第二种算法:
int sum = 0, n =100; /*执行了一次*/
sum = (1 + n) * n /2 /*执行了一次*/
printf("sum = %d", sum); /*执行了一次*/
O(3)
这就是算法的时间复杂度
最后再次声明,本人也是初学者,对于一些概念我都是尽量的简化,这是一个学习笔记,本人知识有限对于实在不能简化的,是直接从书上搬过来的!