重新认识 Algorithms and data structures(算法与数据结构)
1. 什么是算法?什么是数据结构?
算法:
算法(Algorithms)即解决问题的详细步骤。百度百科,各种书籍中有许多非常专业的解释,但简单直接的理解就是解决问题的步骤和方法。
用到算法的地方很多,不止计算机编程,包括一些建筑设计计算中也都有使用。乃至计算机网络通讯底层等(比如循环冗余算法、帧检验序列,网络数据传输前的数据压缩,哈夫曼编码算法)。硬件内嵌算法:如 GPU 中的计算等。还有一些存储数据压缩等。现在的人工智能,其核心也即算法,只是涉及专业面比较广,包括神经网络等等。
一个编程算法的诞生过程:抛出问题——> 分析问题——> 建立数学模型——> 解决方法(解题,是否有解,无解则不用再进行下去,或舍去一些必要因素,选取折中算法)——> 转化为代码实现.
数据结构:
百度百科对数据结构的定义:
数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。 [2]
数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。 [2]
数据结构的研究内容是构造复杂软件系统的基础,它的核心技术是分解与抽象。通过分解可以划分出数据的3个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。上述两个方面的结合可以将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。
数据结构的理解:
数据结构分为逻辑结构和物理结构,逻辑结构即是我们抽象想象的一种结构,物理结构又叫存储结构。比如我们平时所说的树结构,这就是逻辑结构,但是这种结构的数据在计算机中真正存储的时候是不是就是存成我们想象中的那么一棵树呢?答案当然是:不是的。
物理结构即存储结构:有顺序存储、链式存储、索引存储和哈希存储,意思就是它在内存或者说存储介质中是怎样存储的,他们的存储地址是否连续,每个单元之间是否有联系,它们的存储地址是怎样定位的,这些都是它们存储时的物理特性。而我们说的树结构,图结构,集合,线性结构都是属于逻辑上的一种特性。比如,在班级教室中,小明的后面坐着小红,小红的后面坐着小花,小李坐在三排四列,这些都是学生在教室中的物理位置,那我们接着又说小明的对象是小花,小李的对象是小红,但是小李又喜欢小花,这就慢慢开始复杂了吧,这就属于人与人之间的伦理特性了,类比于数据结构中的逻辑结构。
逻辑结构与物理结构之间又是相互依存的,一个逻辑结构可以表现为不同的物理结构,就像什么?就像我们计算机机器码和高级编程语言的关系一样。
我们常用的数据结构有:数组,链表,栈,队列,树,图,堆,散列表等。要注意的是:我们说的堆栈,可不是说这个堆,这个堆其实是一种比较特殊的树结构。
2. 能做什么?有什么用?
我们可能听过一句话,算法是编程的灵魂。数据结构恰恰是算法操作的基石,由此可见,算法和数据结构的重要性。它就像是我们计算机系统的内核一样!
常见的例子有很多:比如我们的地图推荐最短路线,总不可能算一天吧?我们去排序一个东西,在数据量不大的情况下我们都要排序好久的话,那数据量大的情况下,操作的次数多的情况下呢?所以很重要。
还有,评估一个算法即是评估它的可行性,时间复杂度和空间复杂度。一般即是评价它的时间复杂度 O(n),但是空间复杂度也是一个不可忽略的指标,它也涉及到很大的资源分配,我们现在比较熟知的大数据计算,如 Hadoop 生态,它即是计算向数据移动,一个很重要的特性,打开官网,就可以看到那句英文介绍。什么意思呢?简单粗暴点:就是把计算的程序移动到放数据的机器上,在这台机器上进行运行计算。
3. 我们怎样来 get 和 To improve?
它没有捷径,只有不断的思考和练习,就像一个人的逻辑思维能力一样,我们日复一日的思考,研究即可,不需要立刻很短的去搞明白一个算法,我们注重的是搞清楚这个算法的过程,带给我们思维的提高,时间久了,就像杨过睡了十年寒玉床一样。实际的工作生活中,它也是符合二八定律的,就是学它的二分内容,就可以用在八分的场景里面了。
4. 长久的算法学习和研究对我们 gain ?
长久的算法学习和研究对我们的作用就像是在某种情况下开挂了一样。不管是读代码和做其他的,无往不利,因为它带给我们的不止止是编程算法的领会,更是对我们编程人生中编程逻辑的提高。