数据结构和算法(Golang实现)(8.1)基础知识-前言

基础知识

学习数据结构和算法。咱们要知道一些基础的知识。算法

1、什么是算法

算法(英文algorithm)这个词在中文里面博大精深,表示算帐的方法,也能够表示指挥若定的计谋等。在计算机科技里,它表示什么呢?编程

计算机,顾名思义是用来计算的机器。算法在计算机科学中能够描述为:计算机接收一个输入指令,而后进行一个过程处理,最后输出计算的结果。segmentfault

这种输入-过程处理-输出,用人类的行为模式,很容易理解,好比妈妈让小明去打酱油,打酱油的命令是输入,小明发现小区周边有5家店有酱油出售,娟娟超市是离家最近的,而子龙杂货店虽然离得最远,但酱油很便宜。小明为了省钱,跑到最远的子龙杂货店买了酱油,而后顺利回到了家,交给了妈妈。买酱油的过程就是处理,而给妈妈的酱油是输出。

小明为何不去最近的娟娟超市,而去了最远的子龙杂货店,这是小明脑壳里思考后产生的最佳方案。固然,如今买酱油能够经过外卖软件,小明能够打开美团外卖软件,搜索关键字:酱油,而后点击筛选,离家最近的和最便宜的,而后选择最便宜的酱油下单。数组

买酱油的过程 = 美团外卖软件下单的过程。数据结构

人类在几千年的演化中,会进行数字运算了,会进行利益权衡了,而后造了机器,将本身的行为模式,赋予了机器,解放了自身。若是人类真正了解人脑神经元的信息传递过程,甚至可能造出有自我意识的机器,但这种场景仍然只能在科幻电影中看到。并发

因此,这个逻辑过程,或行为模式,在计算机里面映射的是算法。机器学习

用更准确的描述来讲:算法是一种有限,肯定,有效的并适合用计算机程序来实现的,用来解决问题的方法。首先,有一个问题,而后有一个方法去解决它,这个方法叫算法。数据结构和算法

算法是有限的,就是算法的步骤是有限的,执行的时间也是有限的,可以在有限时间内得出结果。算法是肯定的,就是不管执行多少次,计算得出的结果都同样。算法是有效的,就是计算出的结果对解决问题有帮助。编程语言

然而算法的定义一直被刷新,由于机器学习的出现,基于海量超大规模数据,机器学习算法的步骤是无限的,能够一直计算下去,每次计算的结果也不同,但若是人为进行步骤限制,以及增长训练阈值,训练时得出的参数超过设定的阈值立刻中止运算,倒也符合以上的定义。函数

算法要在有限的时间内完成,自己是对人类的一种负担,由于人类造出的机器还不够强。为何呢?由于即便算法的步骤是有限的,执行的时间也可能特别长。

正如《从一到无穷大》书中印度教圣地贝拿勒斯神庙下的三根宝石针,印度教主神焚天说过,谁能够把第一根宝石针的64块金片经过第二根宝石针移到第三根,焚天塔,神庙,婆罗门将化为灰烬,这是有名的汉诺塔算法。

汉诺塔问题能够描述为:

有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(以下图)。游戏的目标:把A杆上的金盘所有移到C杆上,并仍保持原有顺序叠好。

操做规则:每次只能移动一个盘子,而且在移动过程当中三根杆上都始终保持大盘在下,小盘在上,操做过程当中盘子能够置于A、B、C任一杆上。

咱们很天然想到一个算法:

  1. 咱们必须先借助C杆,将A杆前面N-1个盘子,移动到B杆后,将A杆剩下的一个盘子,直接移动到C杆,这时候A空了。
  2. 而后借助A杆,将B杆的N-1个盘子,移动到C杆,任务就完成了。

十分朴素的思路,咱们用编程语言来实现:

package main

import "fmt"

var total = 0

// 汉诺塔
// 一开始A杆上有N个盘子,B和C杆都没有盘子。
func main() {
    n := 4   // 64 个盘子
    a := "a" // 杆子A
    b := "b" // 杆子B
    c := "c" // 杆子C
    tower(n, a, b, c)

    // 当 n=1 时,移动次数为 1
    // 当 n=2 时,移动次数为 3
    // 当 n=3 时,移动次数为 7
    // 当 n=4 时,移动次数为 15
    fmt.Println(total)
}

// 表示将N个盘子,从 a 杆,借助 b 杆移到 c 杆
func tower(n int, a, b, c string) {
    if n == 1 {
        total = total + 1
        fmt.Println(a, "->", c)
        return
    }

    tower(n-1, a, c, b)
    total = total + 1
    fmt.Println(a, "->", c)
    tower(n-1, b, a, c)
}

经过概括,咱们能够知道移动次数Total(N)的关系是Total(N)=2*Total(N-1)+1,每多一个盘子,移动次数就会翻倍加一,咱们经过相关的数列数学方法能够知道Total(N)=2^N-1,也就是移动次数是一个指数方程:2的N次方,指数等于盘子的数量。

咱们计算出2^64-1=18446744073709551615,能够知道一我的日夜不停,一秒移动一次:18446744073709551615/3600/24/365/100000000=5849,要5849亿年时间才能够完成这件事,那时候世界确实可能已经毁灭。

在计算机科学中,由于全部的算法都是人定义的规则,规则是死的,因此不要担忧学不会。当你学会了这些算法,你将会以为,哇,一切都那么简单。

2、什么是数据结构

数据结构,顾名思义就是存放数据的结构,也能够认为是存放数据的容器。好比,你要找出1000个数字中的最大值,首先你要将1000个数字记在某些卡片上,而后对卡片进行排序。

大多数算法都须要组织数据,因此产生了数据结构。数据结构在计算机中,主要是用来实现各类算法的基础,固然数据结构自己也是算法的一部分。

基本的数据结构有:链表,栈和队列,树和图。

链表,就是把数据连接起来,关联起来,一个数据节点指向另一个数据节点,像天然界的一条条铁链,大部分数据结构,都是由链表的若干变种来表示。

在每种编程语言中,数组做为基本数据类型提供,数组是连续的内存存储空间,经过下标0,1,2能够迅速获取到数组指定位置的数据。链表也能够用数组来实现,但通常状况下,由于数组是连续的,在链表增长和删除节点时容易形成冗余,效果不佳。因此链表在不一样编程语言实现是这样的:C、C++是用指针来实现的,Java是用类来实现的,而Golang是用结构体引用来实现。

栈和队列,主要用来存储多个数据,只不过一个是先进后出,一个先进先出。好比下压栈,先入栈的数据是最后才能出来,而咱们熟知的队列,先排队的人确定先得到服务。

其次是树和图,树就是有一个树根节点,存放着数据,下面有不少子节点,也存放着数据,类比天然界的树。图则能够类比天然界的地图,多个点指向多个点,点和点之间有一条或多条边,而这些点存放着数据,边也能够存放着数据,好比距离等。

围绕这几种数据结构,有若干延伸,加上一些排序,查找逻辑,就造成了更高层次的高级数据结构。

数据结构是算法实现的辅助,是为了更高效组织数据的结构,因此数据结构和算法其实密切联系,并不须要分得太清,你们能够把数据结构等同于算法。

3、什么叫好的数据结构和好的算法

学习算法的缘由,是好的算法能够节约资源,可是选择合适的算法很难。咱们要进行复杂的数学分析才能知道,什么叫作好的,在计算机里,咱们把这种数学分析这叫作算法分析。

什么是好的数据结构和好的算法?

  1. 计算机资源是有限的,因此占用计算机资源越少的数据结构和算法越好。
  2. 人的生命是有限的的,等待时间是有忍耐度的,因此能辅助程序越快完成工做的数据结构和算法越好。

因此出了个理论:时间和空间算法复杂度理论。

程序执行过程当中,要么空间换时间,要么时间换空间,空间能够认为是一种计算机资源如内存使用状况,而时间是人类感知的第四个维度,就是慢仍是快,二者通常不能兼得,若是发现竟然兼得了,那就是发明了一种更好的算法。

在计算机科学发展的四五十年,这种既省资源又省时间的发明仍是比较少的,好比数据压缩算法,由于发明了超高效的无损数据压缩算法,咱们网上看视频的时候,既不失真,也不卡顿,又快又好,这种就叫好算法。

目前有一种新型的计算方式正在研究中,叫量子计算,能够在很是小的空间,使用很是少的资源,短期内计算超级大量的数据,让咱们期待能成功量产的那天,到了那时候,人类生产力将极大被解放。

4、总结

程序设计在通常程度上,不少人都认为=数据结构+算法。

咱们学习数据结构和算法,是为了更高效率写出更快,更好的代码。

由于学习过,因此咱们不须要从零开始设计,工做效率就提升了。

由于知道每种数据结构和算法的复杂度和适用场景,自由选择组合,咱们写出的代码计算速度变快了,占用的资源更少了。

因此咱们要好好学习和理解常见的数据结构和算法。

欢迎阅读剩下的章节。

系列文章入口

我是陈星星,欢迎阅读我亲自写的 数据结构和算法(Golang实现),文章首发于 阅读更友好的GitBook

相关文章
相关标签/搜索