数据结构与算法简介(一)
本文主要是针对读完《数据结构与算法图解》(出版社:人民邮电出版社)所做的读书笔记,这本书属于算法的入门书籍,通俗易懂。本文预计分为四大部分:
- 数据结构相关的基本概念;
- 算法相关的基本概念以及如何描述一个算法的性能:大O记法
- 常见的数据结构的介绍,并对其时间复杂度进行评价:(1)散列表(2)栈和队列(3)数组(4)基于结点的数据类型(链表、二叉树、图);
- 空间复杂度的简单介绍。
前言
概念和专业术语,都是为了让我们的交流的时候忽略这些约定俗成的概念,将注意力放在解决问题上。所以虽然这些概念初次看到会让人感觉枯燥乏味,但把它们记住对于学习很有帮助。我觉得可能是由于概念的文字所蕴含的信息密度较大,需要用一定程度的了解对其进行稀释,才能理解它、发现它的妙处。
数据结构的一些基本概念
数据:
指代各种信息,可以看做一堆数字与字符串的组合。
数据结构:
数据的组织形式,可以类比班级、公司就属于人的组织形式,而数组、集合就属于数据结构。
对数据结构的操作:
一般的数据结构在用法上,逃不开读取、查找、插入、删除四种,而这本书在评价数据结构的时间复杂度时,也都是基于以上四种用法进行的,以此衡量在特定场景应用中的优劣。
一种最基本的数据结构:数组
以数组为例(注意,这里的数组与特定语言中的数组意义并不完全一致,这里的数组中是不包含空值的):
- 读取:查看数组中某一位置的数据;
数组的读取很快,只要一步就可以了,但是这是基于以下前提的:
a.数组在内存上是连续的;
b.数组记录了开头的内存地址; - 查找:在数组中查找某一数据的位置;
对于一个元素个数为N的数组,逐个比对的查找(即线性查找),最多要N步。即当这个数组没有任何约束时(比如是否有序、是否可以有重复元素等),查找只能逐个对比。 - 插入:给数组添加一个新数据;
基于上面在读取中提到的前提条件,插入分末尾插入和非末尾插入:
a.末尾插入只要一步;
b.而非末尾插入,在插入前需要进行元素移动,以腾出空间;对于一个元素个数为N的数组,最坏的情况为在开头插入,需要N+1步; - 删除:移除数值中的某一位置的数据;
删除相当于插入的反向操作,情况与插入一致。
一种有限制的数组:集合
- 定义对比
通过对比数组和集合,可以让我们对不同的数据结构在上述四种用法中的差别产生一定的感性认识——这里的集合也不是特定语言中的集合,而是增加了一个约束条件的数组,这个约束条件是:元素不允许重复。元素不允许重复,这对于我们日常编码时有很重要的意义,可以减少一些不必要的操作。 - 用法对比
集合的大部分操作在性能上相同,除了插入。根据上面对数组插入用法的描述,我们可以很容易的得出以下结论:
集合的插入=查找+插入,即在添加元素前,需要查找新元素是否在原有集合中,如果有则不能添加;对于集合,即使在末尾插入,需要N+1步,更不用说在开头添加,那就是2N+1步了。
这个对比同时也是时间复杂度的一种分析方法,有了这个方法,我们就可以对不同的数据结构进行横向比对和纵向比对了。