
数据结构与算法分析
云计算小菜鸟
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
动态规划问题
淘宝的“双十一”购物节有各种促销活动,比如“满 200 元减 50 元”。假设你女朋友的购物车中有 n 个(n>100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限度地“薅羊毛”。作为程序员的你,能不能编个代码来帮她搞定呢?要想高效地解决这个问题,就要用到我们今天讲的动态规划(Dynamic Programming)。动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提原创 2020-06-27 11:18:27 · 1591 阅读 · 0 评论 -
字典树——实现搜索引擎的搜索关键词提示功能
搜索引擎的搜索关键词提示功能,我想你应该不陌生吧?为了方便快速输入,当你在搜索引擎的搜索框中,输入要搜索的文字的某一部分的时候,搜索引擎就会自动弹出下拉框,里面是各种关键词提示。你可以直接从下拉框中选择你要搜索的东西,而不用把所有内容都输入进去,一定程度上节省了我们的搜索时间。尽管这个功能我们几乎天天在用,作为一名工程师,你是否思考过,它是怎么实现的呢?它底层使用的是哪种数据结构和算法呢?像 Google、百度这样的搜索引擎,它们的关键词提示功能非常全面和精准,肯定做了很多优化,但万变不离其宗,底层最基原创 2020-06-23 09:55:48 · 1591 阅读 · 0 评论 -
字符串匹配算法
字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖接下来要讲的字符串匹配算法。1.BF算法BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。在开始讲解这个算法之前,我先定义两个概念,方便我后原创 2020-06-22 09:36:25 · 1629 阅读 · 1 评论 -
图的广度优先搜索和深度优先搜索
我们知道,算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,比如今天要讲的两种最简单、最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。图有两种主要存储方法,邻接表和邻接矩阵。本文使用邻接表来存储图。我这里先给出图的代码实现。需要说明一下,深度优先搜索算法和广原创 2020-06-19 12:09:49 · 3561 阅读 · 0 评论 -
堆及其应用
1.如何理解堆?首先我们必须明确一点:堆是一种特殊的树。严格意义上来说:堆是一种特殊的完全二叉树。堆是一个完全二叉树。堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。对于每个节点的值都大于等于子树中每个节点值的堆,我们称之为“大顶堆”。反之称之为“小顶堆”。2.如何实现一个堆?要实现一个堆,我们先要知道,堆都支持哪些操作以及如何存储一个堆。首先,完全二叉树比较适合用数组来存储。用数组来存储完全二叉树是非常节省存储空间的。因为我们不需要存储左右子节点的指针,单纯地通过数组原创 2020-06-18 11:38:08 · 295 阅读 · 0 评论 -
红黑树
在前面,我们依次讲了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是 O(logn)。不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于logn的情况,从而使得各个操作的效率下降。极端情况下,二叉树会退化成链表,时间复杂度会退化到O(n)。我上一节已经说过,要解决这个复杂退化的问题,我们需要一种平衡二叉查找树,也就是今天要说得这种数据结构。很多书籍里,但凡讲到平衡二叉查找树,就会拿红黑树作原创 2020-06-16 10:25:02 · 420 阅读 · 0 评论 -
哈希算法的应用
1.什么是哈希算法我们前面几节讲到“散列表”“散列函数”,这里又讲到“哈希算法”,你是不是有点一头雾水?实际上,不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。所以,我们常听到有人把“散列表”叫作“哈希表”“Hash 表”,把“哈希算法”叫作“Hash 算法”或者“散列算法”。那到底什么是哈希算法呢?哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈原创 2020-06-08 11:33:23 · 685 阅读 · 1 评论 -
散列表
1.散列思想散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”,你一定也经常听过它,我在前面的文章里,也不止一次提到过,但是你是不是真的理解这种数据结构呢?散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。我用一个例子来解释一下。假如我们有 89 名选手参加学校运动会。为了方便记录成绩,每个选手胸前都会贴上自己的参赛号码。这 89 名选手的编号依次是 1 到 89。现在我们希望编程实现原创 2020-06-04 09:47:40 · 782 阅读 · 0 评论 -
简单二分查找、复杂二分查找与跳表
1.查找的分类1.1 查找表用于查找的数据集合称之为查找表,它由同一类型的数据元素(或记录)组成,可以是一个数组或者链表等数据结构。对查找表经常进行的操作一般有四种:1.查询某个特定的数据是否在查找表中。2.检索满足条件的某个特定的数据元素的各种属性。3.在查找表中插入一个数据元素。4.从查找表中删除某个数据元素。1.2 静态查找表与动态查找表如果一个查找表的操作只涉及到1和2的操作,则无需动态地修改查找表,此类查找表称之为静态查找表,反之称之为动态查找表。适合静态查找表的查找方法有:顺序原创 2020-06-01 16:05:31 · 867 阅读 · 0 评论 -
十大经典排序算法
1.排序算法概述十种常见的排序算法可以分为两大类:**比较类排序:**通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也被称为非线性时间比较类排序。**非比较类排序:**不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称之为线性非比较类排序。2.交换排序2.1 冒泡排序(Bubble Sort)冒泡排序是一种简单...原创 2020-05-30 10:56:58 · 296 阅读 · 0 评论 -
操作受限的线性表-栈与队列
首先说一个结论:链表,指的是链序存储的线性表。1.单链表原创 2020-02-28 09:26:54 · 1754 阅读 · 0 评论 -
线性表的构成形式-数组(顺序结构)与链表(链式结构)
什么是数组?数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。好的,这里存在着三个关键词,线性表、连续内存空间、以及相同类型数据。我们一个个看。1.线性表线性表以实现方式分为顺序结构(数组)和链式结构(链表)。数组这里的线性是指的逻辑上的线性,即只要数据的保存满足了一对一关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接没有例外;...原创 2020-02-23 18:14:02 · 896 阅读 · 0 评论