从零开始学算法,首先从数据结构的学习开始,本人基于《大话数据结构》这本书,记录自己的学习日常和感悟,如有不足之处希望大家批评指正。
一、数据结构
(一)基本术语
1.数据:
数据是可以被计算机识别并进行相关操作的信息,分为两种,一是我们通常意义下的数值(整型,浮点型、实型等),二是非数值类型(字符、声音、图像、视频等),字符数据可以进行非数值处理,声音、图像、视频等数据可以通过相关编码处理转化为字符数据,从而进行处理。
2.数据元素:数据元素是组成数据的基本单位
3.数据项:一个数据元素由若干个数据项组成
4.数据对象:相同性质数据元素的集合
5.数据结构:具有一定关系的数据元素的集合
看完上述文字,可能还是有一些凌乱,让我们来举一个例子,假设在生物这个群体中,有人类,牲畜类等,在人类群体中的数据元素就是人,并且根据不同的分类方式可以得出不同的数据项,从一个角度看人的各个器官就是数据项,从另一个角度看人的姓名、性别等信息也是人的数据项。而在这个情况下,有的人具有相同的性别(或者别的相同数据项),那么他们的集合就属于数据对象。数据结构可以类比家庭族谱,这个家族的人就具有相应的联系,他们的集合就成为数据结构。这是我个人的一些理解。
(二)结构
1.逻辑结构:数据对象中数据元素之间的相互关系,这个大家应该很容易理解。
集合结构,所有元素属于一个集合,元素之间相互没有关系
线性结构,一对一
树形结构,一对一或一对多
图形结构,多对多
2.物理结构:数据在计算机中的存储形式
顺序存储:按照顺序将数据存放在连续的存储单元中
链式存储:数据元素存放在任意的存储单元中,通过指针存放数据元素的地址,这样在使用时就可以找到相关的数据元素
二、算法
算法是解决特定问题求解步骤的描述,有五个基本特性:输入、输出、有穷性、确定性和可行性。不会出现死循环表示有穷,一条指令只有单纯的一个含义表示了算法的确定性,算法的每一步都能够通过执行有限次数完成即算法的可行性。那么算法那么多,如何判断这个算法的好与坏?这里引出一个概念,算法的时间复杂度。
算法的时间复杂度通过语句总的执行次数T(n)进行计算,分析T(n)随着n的变化情况确定T(n)的数量级,记作O(f(n)),这是大〇记法,具体规则如下:
1.用常数1取代运行时间中的所有加法常数
2.在修改后的运行次数函数中,只保留最高阶项
3.如果最高阶项存在且不为1,则去除与该项相乘的常数。得到的结果就是大〇阶
常见的时间复杂度
O(1)< O(log n)< O(n)< O(nlog n)< O()< O()< O()< O(n!)< O()
时间复杂度又分为平均时间复杂度和最坏时间复杂度,一般没有特殊说明情况下,指的都是最坏时间复杂度。
算法除了时间复杂度外还有空间复杂度,空间复杂度表示了为实现该算法所占用存储空间的大小,一般没有特指的情况下,复杂度指的是时间复杂度。
通过第一次学习,了解了一些基本概念,重点掌握复杂度的计算与比较,对未来的代码编写有非常重要的作用。
接下来,我将学习线性表的相关知识,相关编程语言采用C++,加油吧胖虎同学!