![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构&算法
基本数据结构与算法(不包括ML)
frostime
这个作者很懒,什么都没留下…
展开
-
【串匹配算法】BF和KMP完全详解+手动求next数组
关于字符串的模式匹配问题,有许多算法,这里介绍最简单著名的两个。1. 暴力求解一个简单粗暴的方法就是,从主串的第一个字符和模式串的第一个字符开始,一个一个字符匹配。一旦失配,就从该次匹配开始时匹配的主串字符的下一个字符开始重新匹配。int BruteForce(const string &src, const string &pattern){ int srcPt...原创 2020-03-20 00:22:55 · 434 阅读 · 0 评论 -
【排序】n2以下级别的基本排序算法:希尔排序、归并排序、堆排序和快排
介绍基于比较的排序剩下的几个,剩下几个的算法效率都高于前面几个,除了希尔排序之外都是 O(nlogn)O(n\log{n})O(nlogn) 级别的。1. 希尔排序1.1 思路插入排序的算法复杂度为 O(n2)O(n^{2})O(n2),但如果序列为正序可提高到 O(n)O(n)O(n),而且直接插入排序算法比较简单,希尔排序利用这两点得到了一种改进后的插入排序。希尔排序在数组中采用跳跃...原创 2020-03-20 00:13:09 · 463 阅读 · 0 评论 -
01背包问题完全详解
title: 背包问题date: 2019-06-02 13:44:54mathjax: truecategories:算法动态规化背包问题 (Knapsack problem) 是一种组合优化的 NP 完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背...原创 2020-03-20 00:03:28 · 2451 阅读 · 0 评论 -
堆/优先队列与二叉堆
1. 堆的概念堆又名优先队列,是一种特殊的队列结构(尽管实现可能和队列毫无相似之处)。它的特点如下:入队: 和正常队列一样把元素插入到数据结构中出队: 将最小/大的元素出队根据出队元素是最大的还是最小的元素又可以把堆分类为大顶堆和小顶堆两类。堆的应用很广泛,最典型的例子就是带有优先级的排队,例如对中断的响应问题:优先响应高优先级的中断,同等优先级的按照顺序排队等。堆的实现方式有很多...原创 2020-03-19 23:41:14 · 337 阅读 · 0 评论 -
树结构的打印——Python实现
在做 HTML 的解析的时候遇到的需求,希望能用 Python 实现一下类似 bash 下 tree 命令输出的效果,类似这样:.├── a3c_demo.py├── dqn-boat_mannual│ ├── ICONS_Python│ ├── Image│ ├── __pycache__│ ├── ddpg.py│ ├── enviroment.py│ ...原创 2020-03-11 23:46:01 · 2736 阅读 · 0 评论 -
不要滥用递归
来看一个例子:template<typename Iterator>void Print(Iterator start, Iterator end, ostream &out = cout){ if (start == end) { return; } out << *start++ << endl; Print(start, end, o原创 2017-09-14 17:32:15 · 755 阅读 · 0 评论 -
BM算法
BM算法 BM算法就是这样的一个算法。首先它和KMP算法一样都是从主串的最左端开始,然后不断右移的: 不同之处在于,BM算法每次判断匹配时是从右往左比较的。 下面给出的是一个简单的后缀比较的BF算法,而它和BM算法的区别就在于++patAt的不同:int postfixBfMatch(const string & text, const string & pat){ //patAt指原创 2017-10-20 13:58:08 · 15288 阅读 · 12 评论 -
【C++】踩坑: 对priority_queue.top() 取址 + 哈夫曼的实现
1. 踩坑记录今天天气好,我高高兴兴地打算用 priority_queue 实现一个哈夫曼树,我是这么做的:struct Node{ int val; Node *left = nullptr; Node *right = nullptr; Node(int v, Node *l = nullptr, Node *r = nullptr): val(v), l...原创 2019-06-28 17:26:37 · 1796 阅读 · 4 评论 -
最大子阵和
思路最大子矩阵和是最大字段和的一个拓展延申。相当于把原本一维的数组延展到二维上面来。首先来列一下最大子段和的算法:int maxSubArray(int arr[], size_t n){ int maxSum = arr[0], dp = 0; for (int i = 0; i &lt; n; ++i) { dp = max(arr[i], dp...原创 2018-10-19 15:26:09 · 860 阅读 · 0 评论 -
卡特兰数相关问题
引例从一个简单的问题引入:电影票每张50元,如果有 m+n 个人排队买票,其中m个人各持有50元面值的钞票1张,另外n个人各持有100元面值的钞票1张,而票房没有预备找零.有多少种方法可以将这m+n个人排成一列,顺序购票?乍一看,这个问题完全就是一个最简单的全排列问题,只要将所有可能排列下来,然后逐个检查就行了。实际上,这可以说是一类十分经典的问题,我们可以将上述问题抽象为这样一个泛化...原创 2018-10-16 20:22:07 · 934 阅读 · 0 评论 -
二叉查找树
概论 二叉搜索树(Binary Search Tree, BST),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: - 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 - 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值 - 它的左、右子树也分别为二叉排序树 顾名思义,BST常用于搜索结构。现在我们给出通常对BST进行的操作的概述:原创 2017-09-23 23:37:49 · 310 阅读 · 0 评论 -
常用博弈
巴什博弈(Bash’s Game)问题描述 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 另一种表述: A和B一块报数,每人每次报最少1个,最多报m个,看谁先报到n 巴什博奕是博弈论问题中基础的问题,它是最简单的一种情形对应一种状态的博弈。分析模拟分析 首先我们进行简单的分析...原创 2018-04-09 23:27:20 · 305 阅读 · 0 评论 -
整数划分问题(分苹果)
整数划分 对于任意一个正整数n,它可以表示为多个其他正整数相加。例如: 6 = 6 = 5 + 1 = 4 + 2 = 4 + 1 + 1 = 3 + 3 = 3 + 2 + 1 = 3 + 1 + 1 + 1… 我们称这种不同的组合为不同的整数划分。这类问题是经典的组合数学问题。常常要用到动态规划。经典整数划分问题 给定两个数,n和m。请问n的最大加数为不超过m的...原创 2018-04-09 23:25:43 · 1546 阅读 · 0 评论 -
质数相关算法
素数的性质性质一: 分布limx→∞π(x)=limx→∞xlogx" role="presentation">limx→∞π(x)=limx→∞xlogxlimx→∞π(x)=limx→∞xlogx\lim_{x\to \infty}\pi(x) = \lim_{x\to \infty}\frac{x}{logx原创 2018-02-02 12:24:13 · 1457 阅读 · 0 评论