大家好,我是程序员牛肉。
自从计算机诞生以来,人们就在不断的探索如何高效的把现实世界的信息存储到计算机当中。为此我们创造出了各种数据结构来不断的满足我们的业务需求。例如:栈,队列,哈希表,树,图。
而学习数据结构与算法,就是让我们去深入的了解这些数据结构。并不断的尝试融会贯通,最终可以根据自己的业务需求从现实数据中抽离出合适的数据结构。
在正式学习数据结构与算法之前,我们要先来学习什么是“数据结构”以及什么是“算法”。
什么是数据结构
数据结构就是相互之间存在一种或多种特定关系的数据元素的集合。而我们学习数据结构,实际上就是在学习这些数据元素相互之间的关系。
通俗的来讲,学习数据结构,就是在学习这些数据是以何种形式存放到计算机中的。他们的逻辑形式是什么?他们在内存中的实际存储结构是什么?我们可以对这些数据进行哪些运算。
我们用一张表就可以轻易的表示数据有哪些逻辑结构:
集合结构:也就是说这些数据除了属于同一个集合之外,没有任何的关系。
线性结构:这些数据除了第一个元素之外,每一个元素都有自己的前驱元素,除了最后一个元素之外,每一个元素都有自己的后继元素。并且数据元素之间是一对一的关系。
树形结构:树形结构的元素之间存在一对多的关系。
图性结构:图形结构的数据元素是多对多的关系。
这四个逻辑结构离我们的生活很近,我来举个例子:
说完了数据的逻辑结构,我们来看看存储结构。存储结构是在探讨这些数据在计算机具体的存储单元中到底要怎么存放。
顺序存储:就是把数据元素存放在地址连续的存储单元中。但是这种存储结构有一个缺陷:如果我们要存储 3 个元素,就要找到 3 个连续的空位进行存放,但是如果没有连续的 3 个空位呢?
例如下图这种情况,我们明明是有三个空位的,但是由于这三个空位不是连续的,我们也就不能按照顺序存储的方式存储数据了。
为了改进这一缺陷,我们想到了链式存储:
通过这种形式,我们就把数据存储在了不连续的存储单元内。
这两种存储方式各有利弊,顺序存储方便查找和修改元素。链式存储方便删除和添加元素。我们需要根据自己的需要选择存储方式。
接下来我们来介绍算法。
summer
什么是算法
算法其实就是对问题求解的一个步骤。他是指令的有限序列。
通俗的来讲:算法就是你写的代码。你哪怕写一行代码,那也是算法
一个算法应该有以下五个重要的特征:
既然是算法,那就有好坏之分。我们用时间复杂度和空间复杂度来描述算法的好坏。
无论是时间复杂度还是空间复杂度,都是在尝试探讨一个数量级上关系。
时间复杂度(Time Complexity)
时间复杂度是衡量算法执行时间与输入数据规模之间的关系。通常用大O符号表示,例如O(n)、O(n^2)、O(log n)等。时间复杂度描述了算法在最坏情况下的性能。
空间复杂度(Space Complexity)
空间复杂度是衡量算法在执行过程中所需的存储空间与输入数据规模之间的关系。它同样使用大O符号来表示。
而现代计算机由于存储空间的不断扩张,相比较于空间复杂度,我们更加关注一个程序的时间复杂度。有的时候甚至会为了时间复杂度牺牲空间复杂度。
我们学习数据结构,主要是在学习三个部分:逻辑结构,存储结构和运算。后面我的文章也会主要围绕这三部分去讲。除此之外,学习结构与算法需要你有C语言的相关知识储备,最起码你要能看懂相关的代码。
相信通过我的介绍,你已经大致了解什么是“数据结构”与“算法”。希望我的文章可以帮到你。
下一篇文章我们将学习什么是线性表。