Go 语言学习:基础语法
Go 基础 简介 Go 语言主要特征 自动立即回收。 更丰富的内置类型。 函数多返回值。 错误处理。 匿名函数和闭包。 类型和接口。 并发编程。 反射。 语言交互性。 25个关键字 go break switch case select package import func ...
Go 基础 简介 Go 语言主要特征 自动立即回收。 更丰富的内置类型。 函数多返回值。 错误处理。 匿名函数和闭包。 类型和接口。 并发编程。 反射。 语言交互性。 25个关键字 go break switch case select package import func ...
Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。 Trie树的实现 Trie 树主要有两个操作,一个是将字符串集合构造成 Trie 树。这个过程分解开来的话,就是一个将字符串插入到 Trie 树的过程。另一个是在 ...
栈是一种操作受限的线性表数据结构,仅允许在一端插入或删除数据。栈中的数据后进者先出。 栈的实现 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。如下是顺序栈的代码实现: // 基于数组实现的顺序栈 public class ArrayStack { private String[] items; // 数组 p...
跳表(skiplist)本质上是一种查找结构,用于解决算法中的查找问题(Searching),即根据给定的key,快速查到它所在的位置(或者对应的value)。 实现原理 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)。假如我们每相邻两个节点增加一个指针,让指针指向下下...
如何理解递归 递归是一种应用非常广泛的算法(或者编程技巧),很多数据结构和算法的编码实现都要用到递归。举个生活中用到递归的例子,周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办?别忘了你是程序员,这个可难不倒你,递归就开始排上用场了。于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。但是,前面的...
队列是一种操作受限的线性表数据结构,它的特点是只允许在表的前端进行删除操作,而在表的后端进行插入操作。即先进者先出。队列只支持两个基础操作,入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。 顺序队列和链式队列 队列可以用数组来实现,也可以用链表来实现。用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。 用数组实现队列需要两...
定义 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表和数组一样,作为最底层的数据结构,是很多其他数据结构的底层实现,比如可以用链表来实现队列、栈等等。相比数组对连续内...
堆是一种特殊的树,首先,它是一个完全二叉树,其次它的每个节点的值都必须大于(或小于等于)其子节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。 堆的实现 堆是一颗完全二叉树,所以优先使用数组存储,相比与链表法可以更节省存储空间。因为我们不需要存储左右子节点的指针,单纯地通过数组的下标,...
散列表(hash table),又名‘hash表’,它用的是数组支持按照下标随机访问数据(时间复杂度O(1))的特性,所以散列表其实就是基于数组结构的一种扩展。简单的来说,就是把键值通过散列函数求得hash值之后,对数组容量进行取模运算,得到存放在数组位置的下标值,当我们按照键值查询元素时,我们用同样的方法将键值转化数组下标,从对应的数组下标的位置取数据。散列表这种数据结构虽然支持非常...
图是一种非线性的数据结构,表示多对多的关系。图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 拿微信举例子,我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好友,对应到图中,就...
什么是深度、广度优先搜索 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法就是基于“图”这种数据结构的。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。 图的存储邻接表存储方式的实现: public class Graph { // 无向图 private int v; // 顶点的个数 private LinkedList&l...
为什么需要复杂度分析 数据结构与算法要解决的是快和省的问题,即如何让代码运行的更快,如何让代码更省存储空间。那么,执行效率就是算法一个非常重要的考量指标。事后统计法虽然也能帮助我们了解算法的执行效率,但是它有很大的局限性。一是非常依赖测试环境,不同级别的硬件设备,会显示出截然不同的结果;二是测试结果受到数据规模的影响,数据规模较小时,无法表现出一些算法的特性。而时间、空间复杂度分析就可以帮...
树是一种非线性表结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。 树的各种概念 如下图,A 节点就是 B 节点的父节点,B 节点是...
二分查找(Binary Search)算法,也叫折半查找算法。它针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 时间复杂度 我们假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。 可以看出来,这...
编程语言提供的字符串查找函数,它们的底层就是依赖的字符串匹配算法。 BF算法 BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。 它的主要思想是在主串中,检查起始位置分别是 0、1、2….n-m 且长度为 m 的 n-m+1 个子串,...