![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 53
慢慢爬的小蜗牛
这个作者很懒,什么都没留下…
展开
-
字典树详解
字典树一 简介字典树(单词查找树),是一种树形结构,应用于统计、排序和保存大量字符串。优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无畏字符串的比较,查询效率高于哈希树。二 基本结构字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词...原创 2018-07-04 16:07:14 · 176 阅读 · 0 评论 -
广度优先搜索求最短路径及其具体路径
问题:在二维矩阵中,给定起始点和终止点,求从起始点到终止点的最短路径。其中矩阵值为1代表可以通过,0代表障碍。代码如下:#include <iostream>#include <vector>#include <queue>using namespace std;using std::vector;struct point{ int x;...原创 2018-07-24 17:20:14 · 5785 阅读 · 0 评论 -
KMP算法(C++)
KMP算法:void getNext(const string& needle,int next[]){ const int n = needle.size(); int i = 0; int j = -1; next[i] = j; while (i < n) { if (j == -1 || needle[i] == needle[j]) { +...原创 2018-07-18 15:55:44 · 641 阅读 · 0 评论 -
有关排列问题的学习
(1) next_permutation如何找出一个排列的下一个排列?比如对于排列:123,132,213,231,312,321,当知道其中某个排列后,如何知道对应的下一个排列。其原理如下:对于排列:vecttor<int> v={1,2,4,3,6,7,5}步骤1:从后往前遍历,找到第一个比后面的数大的数的下标,因而6的下标是m=4;步骤2:从后往前遍历,找到第一个比v[m]大的数...原创 2018-03-14 20:00:11 · 135 阅读 · 0 评论 -
N queen问题
问题描述:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?问题推广到n×n格,一起有多少种解法?思路1:深搜。设置一个数组 vector<int> v(n,-1)来保存每一行皇后所在的列号。对于每一行,从第一列开始到最后一列,判断是否可以放置。void solutionOfaNqueen(vector<in...原创 2018-03-15 11:21:24 · 326 阅读 · 0 评论 -
top K 问题的解法
问题:输入n个数,求其中最小的k个数。对于该问题,有以下几种思路:(1)全排序。使用快速排序,然后取前k个数。(2)原创 2018-06-27 16:41:03 · 273 阅读 · 0 评论 -
最短路径算法
问题:求图中某个顶点到其它顶点的最短距离。在这里采用邻接矩阵表示图。图由顶点和边构成,两个顶点之间有一条边,边的长度即为路径的长度。其抽象模型如下:解法1:Dijkstra思想接班思想:设置顶点S,包含已经确定最短长度的所有顶点,初始时,集合S里面只有顶点0,然后在集合S外与0连通的顶点里面选择长度最短的作为已经确定的顶点,加入集合S,然后更新到所有未确定最短长度顶点的长度。重复上述过程,直至所有...原创 2018-06-28 20:27:10 · 259 阅读 · 0 评论 -
Dijkstra算法、prim算法和 Kruskal算法详解
1 Dijkstra算法问题描述:在一个图中,给定指定顶点,求该顶点到其它顶点的最短距离。如图所示:这是一个有向图,现在要求解从顶点V1到其它顶点的最短距离。以上图为例,利用Dijkstra算法求解最短距离。步骤:(1)将所有顶点分为两组,一组是未知的即为S,一组是已知的记为W。开始时,S={V1,V2,V3,V4,V5,V6,V7},W={};(2)首先选择顶点V1到其它顶点中距离最短的顶点为已...原创 2018-07-09 22:27:21 · 13874 阅读 · 0 评论 -
链表的归并排序、快速排序、冒泡排序、选择排序
一 链表的快速排序代码如下:void swap(ListNode* a,ListNode* b){ int tmp = a->value; a->value = b->value; b->value = tmp;}ListNode* partitonlist(ListNode* begin,ListNode* end){ if(be...原创 2018-07-12 14:46:45 · 170 阅读 · 0 评论 -
二叉树的遍历总结
二叉树是一种重要的基础数据结构,其定义本身是递归的。二叉树有三种遍历方式,同时既可以利用递归来遍历,又可以利用栈来进行非递归遍历。下面是我个人总结出来的遍历。首先定义二叉树的结构:struct BTreeNode{ char data; struct BTreeNode* lchild; struct BTreeNode* rchild; BTreeNode(char c...原创 2018-03-09 21:15:10 · 361 阅读 · 6 评论 -
动态规划思想以及常见应用
一 动态规划的基本思想以及和贪婪算法、分治法的比较动态规划的基本思想:将复杂问题进行分解,通过求解小规模子问题反推出原问题的结果。动态规划适合求解多阶段决策问题的最优解(可以简单理解为有状态转换的阶段性问题)。这些问题必须满足最优化原理和子问题的无后向性。最优化原理:不管之前的决策是否最优,但是一定要保证从现在开始的决策是在之前决策基础上的最优决策。无后向性原理:当各个子阶段的子问题确定以后,对于...原创 2018-03-30 18:30:52 · 4079 阅读 · 1 评论 -
C++实现bitmap
代码如下:#include<iostream>#include<vector>using namespace std;class BitMap {public: BitMap(int num) :n(num), mask(0x1F), shift(5), pos(1 << mask), a(1 + n / 32, 0){} void set(int...原创 2018-06-06 17:19:07 · 705 阅读 · 0 评论 -
求图中所有路径
阿里巴巴测评题: 思路:从某一个顶点开始,对其进行深搜,找到以它开始的左右路径,注意必须从头结点开始。代码如下:#include <iostream>#include <map>#include <vector>#include <algorithm>using namespace std;using std::vector;...原创 2018-07-25 22:18:25 · 3004 阅读 · 0 评论