[数据结构与算法]
桑来93
time will tell
展开
-
排序算法部分总结
一些排序算法的总结1.选择排序 SelectionSort时间复杂度: O(n^2)C++代码实现:template <typename T>void selectionSort(T arr[], int n){for (int i=0;i<n;i++){ // 寻找[i,n)区间最小值 int minIndex = i; for...原创 2018-07-29 19:33:27 · 139 阅读 · 0 评论 -
数据结构: 链表中哨兵(头结点)的作用
数据结构: 链表中哨兵(头结点)的作用单链表的实现中,常有 带头结点 和 不带头结点 两种实现方式.笔者在做算法与数据结构题目时,非常喜欢使用带头结点的实现方式.可以简化一些边界的处理.哨兵节点哨兵节点,也是头结点,是一个 dummy node. 可以用来简化边界条件.是一个附加的链表节点.该节点作为第一个节点,它的值域不存储任何东西.只是为了操作的方便而引入的.如果一个链表有哨...转载 2019-01-01 17:03:25 · 10845 阅读 · 5 评论 -
数据结构: 链表问题总结
数据结构: 链表问题总结刷了几个链表的题目,做一下总结.题目来自 <程序员代码面试指南>链表本身操作灵活,代码量少.很适合作为面试题考查.链表的基本操作,如增删改查.本文用到链表用的是牛客网上的结构.如下所示:struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), nex...原创 2019-01-01 20:12:44 · 689 阅读 · 0 评论 -
数据结构: 两个单链表相交的一系列问题
数据结构: 两个单链表相交的一系列问题这个是一个比较综合的问题:若两个单链表一个为有环,一个无环. 那么肯定不能相交.若二者都没有环, 问题就转化为 两个无环单链表是否相交,方法就是 快慢指针 ,是否能找到第一个相交的节点.若二者都有环,那么问题变成了两个有换单链表是否相交.第一,先找到二者是否相交.第二,若相交则需要遍历一遍找到相交点.该题可以分解为三个问题:1 ...原创 2019-01-01 20:21:21 · 256 阅读 · 0 评论 -
数据结构: 求字符串中最长的回文字符串
求字符串中最长的回文字符串描述最长回文子串问题:给定一个字符串,求它的最长回文子串长度LeetCode 5暴力枚举备忘录法动态规划分析设置一个二维的数组f.f[i][j] 表示区间 [i,j] 是否为回文串.则状态转移方程为f[i][j] = true (i=j) S[i] ==S[j] (j=i+1) S[i]==S[j] && f[i+...原创 2019-01-06 11:08:30 · 375 阅读 · 1 评论 -
数据结构 : 动态规划学习一
动态规划学习一动态规划,虽然抽象后进行求解的思路并不复杂,但具体的形式千差万别,找出问题的子结构以及通过子结构重新构造最优解的过程很难统一.动态规划求解的一般思路判断问题的子结构,也可以看做状态,当具有最优子结构时,动态规划可能适用.求解重叠子问题.一个递归算法不断地调用调用同一个问题,递归UI可以转化为查表从而利用子问题的解.分治法则不同,每次递归都产生新的问题,重新构造一个最优解....原创 2019-01-18 10:47:03 · 288 阅读 · 0 评论 -
数据结构 : 广度优先搜索
广度优先搜索BFS算法思想二叉树的层次遍历是一种特殊的广度优先遍历.它的基本思想是:首先访问起始顶点v,接着由v的节点出发,访问v的各个未访问过的邻接顶点w1,w2…wi…,再从这些访问过的节点访问…访问他们未访问过的邻接顶点.直到所有节点都被访问.算法必须借助一个辅助队列应用使用场景输入数据: 没有什么特征. 不像深度搜索.有递归的特性.若是树和图.使用BFS...原创 2019-01-12 23:12:15 · 1282 阅读 · 0 评论 -
数据结构 : 深度优先搜索
深度优先搜索DFS算法思想深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。使用场景DFS适合此类题目:给定初始状态跟目标状态,要求判断从初始状态到目标状态是否有解。输入数据 : 若是递归...原创 2019-01-13 16:29:56 · 2830 阅读 · 0 评论 -
数据结构 : 动态规划学习二 | 字符串相似度
动态规划学习二有关字符串的子序列或者配准问题首先考虑 动态规划2 字符串相似度/编辑距离(edit distance)对于序列S和T,它们之间的距离定义为:对二者进行几次以下的操作(1)删去一个字符 (2) 插入一个字符 (3) 改变一个字符每进行一次操作,计数增加1.将S和T变成同一个字符串的最小计数即为他们的距离LeetCode 72. Edit Distance递归解...原创 2019-01-18 22:21:47 · 251 阅读 · 0 评论 -
数据结构 : 动态规划学习三 | 最长公共子序列
动态规划学习三 | 最长公共子序列动态规划 之 最长公共子序列 过程图求最长公共子序列的长度倒推构造最长公共子序列算法推导:动态规划算法解最长公共子序列LCS问题记:Xi=﹤x1,⋯,xi﹥即X序列的前i个字符 (1≤i≤m)(前缀)Yj=﹤y1,⋯,yj﹥即Y序列的前j个字符 (1≤j≤n)(前缀)假设: Z=﹤z1,⋯,zk﹥∈LCS(X , Y)若xm=yn(最...转载 2019-01-19 10:58:56 · 242 阅读 · 0 评论 -
数据结构 : 动态规划学习四 | 0-1背包问题
动态规划学习四 | 0-1背包问题问题描述有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?举例number=4,capacity=8i1234w(体积)2345v(价值)3456过程这是最基本的背包问题.特点: 每种物体仅有一件. 可以选择放或者不放.用子问题定义状...原创 2019-01-19 23:31:26 · 299 阅读 · 0 评论 -
认识布隆过滤器
0. 题目:一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节。这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?1. 使用哈希表100亿数量级太大.全部存储数据量太大.2. 使用位图 BitMapindex = N/32;offset = N%32;用于标记存在与否.但是,可以看出位图所需的空间与所要查询...原创 2019-03-24 21:28:50 · 138 阅读 · 0 评论 -
数据结构: 字符串匹配KMP算法
字符串匹配KMP算法KMP算法的流程假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。一直回溯到匹配或者-1;next数组的含义next 数组各值的...原创 2019-01-05 21:21:22 · 411 阅读 · 0 评论 -
数据结构: 备忘录方法
备忘录方法动态规划算法的一个变形就是 备忘录方法备忘录方法也用一个表格来保存已解决的子问题的答案.在下次需要解决此问题时,只要简单地查看该子问题的解答,而不必重新计算.但与动态规划不同:备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的。备忘录方法的控制结构与直接递归方法的控制结构相同区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相...原创 2019-01-05 11:16:37 · 1045 阅读 · 0 评论 -
数据结构: 反转链表
数据结构: 反转链表反转单链表ListNode* reverseLinkList(ListNode* head) { // 仅有一个或为空,返回自身 if (head == NULL || head->next == NULL) { return head; } ListNode* pre = head; ListNode* cur = head->next; wh...原创 2018-12-29 23:16:50 · 315 阅读 · 0 评论 -
并查集
namespace UF1 { class UnionFind { private: int *id; int count; public: UnionFind(int n) { count = n; id = new int[n]; // 初始化...原创 2018-08-16 23:17:29 · 339 阅读 · 0 评论 -
BitMap
BitMap bitmap算法什么是bitmapbitmap 就是用给一个bit位来标记某个元素对应的 value . 而 key 就是这个元素. 由于采用了 bit为单位 才存储数据. 因此可以大大节约空间.在32位的机器上. 一个整形,如int a,在内存中占有32位.可以用对应32个bit的表示十进制的0-31个数.bitmap算法利用这种思想处理大量数据的排序...原创 2018-08-18 14:49:17 · 1276 阅读 · 1 评论 -
C++ Heap 堆
C++ Heap 堆 C++ STL学习——heap 堆相关算法详解与C++编程实现(Heap) 白话经典算法系列之七 堆与堆排序STL 堆操作初始化堆vector&amp;lt;int&amp;gt;vectorArr = {3,4,5,6,7,1,2}; // 数组make_heap(vectorArr.begin(), vectorArr.end(), le...原创 2018-08-17 15:42:19 · 1061 阅读 · 0 评论 -
排序算法总结(待续)
排序算法总结https://blog.csdn.net/misayaaaaa/article/category/6833062https://www.cnblogs.com/onepixel/p/7674659.htmlhttps://github.com/francistao/LearningNotes/blob/master/Part3/Algorithm/Sort/面试中的 10 大...原创 2018-12-09 19:26:17 · 144 阅读 · 0 评论 -
数据结构: 单链表
复习一下单链表的创建分别实现了 带头结点和不带头结点的尾插法#include "LinkList.h"// 创建一个空链表,不带头结点void CreateLinkList1(ListNode *L) { return ; }// 创建一个空链表,带头结点void CreateListList2(ListNode*& L){ L = new ListNode(-...原创 2018-12-15 19:14:16 · 181 阅读 · 0 评论 -
数据结构 : 图 (待续)
数据结构: 图分类有向图无向图无权图有权图图的连通性图的表示邻接矩阵使用一个 二维矩阵NxN 来表示图邻接矩阵适合 表示 稠密图#pragma once#ifndef GRAPH_DENSEGRAPH_H#define GRAPH_DENSEGRAPH_H#include "MyInclude.h"class DenseGraph {private: i...原创 2018-12-15 22:06:16 · 206 阅读 · 0 评论 -
数据结构: 线段树
线段树为什么使用线段树区间染色有一面墙,长度为n,每次选择一段墙进行染色M次操作后,我们可以可见多少种颜色M次操作后,在[i,j]区间能看见多少种颜色涉及的操作染色操作 (更新区间)查询操作 (查询区间)数组线段树染色操作O(N)O(logN)查询操作O(N)O(logN)什么是线段树以求和为例,每个节点就是存储的每个区间的...原创 2018-12-22 18:48:40 · 146 阅读 · 0 评论 -
数据结构 : 前缀树 Trie
前缀树 Trie1 什么是Trie树Trie树,又叫字典树 前缀树 单词查找树 键树是一种树形结构,是一种哈希树的变种是一种多叉树.1.1 基本性质:根节点不包含字符. 除了根节点之外,每个子节点包含一个字符.从根节点到某一节点,路径通过经过的字符连接.为该节点对应字符串每个节点的所有子节点包换的字符互不相同通常,会在节点结构中设置一个标志,用来标记该结点处是否构成一个...原创 2018-12-22 23:19:09 · 407 阅读 · 0 评论 -
数据结构 : 二叉树的遍历
数据结构 : 二叉树的遍历递归的遍历就不写了下面都是利用迭代的遍历方法前序遍历利用一个栈void NormalBinaryTree::preOrder() { std::cout << "先序遍历: 非递归 " << std::endl; preOrderHelper(root); std::cout << std::endl;}vo...原创 2018-12-29 10:15:10 · 118 阅读 · 0 评论 -
数据结构: 二叉搜索树
二叉搜索树二叉查找树(Binary Search Tree),也称二叉搜索树、有序二叉树(ordered binary tree),排序二叉树(orted binary tree)特点:二叉树若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值任意节点的左,右子树也分别为二叉查找树没有键值相等的节点...原创 2018-12-24 22:57:37 · 138 阅读 · 0 评论 -
数据结构: 平衡二叉树 AVL树
平衡二叉树特点平衡二叉树是对二叉搜索树的优化,为了防止二叉搜索树退化退化成为链表.通过对树的高度进行如下控制:对于任意一个节点,其左子树和右子树的高度差不能超过1平衡二叉树的高度和节点数量之间的关系是 O(logN)的标记每个节点的高度定义template<typename Key, typename Value>class AVL {private: ...原创 2018-12-25 08:59:29 · 281 阅读 · 0 评论 -
C++ 图的算法拓扑排序算法
转载自C++ 拓扑排序算法有向无环图如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图。不含环路的有向图必包含入度为零的顶点—因此一定存在拓扑排序拓扑排序的应用图是否存在环拓扑排序具体算法拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,如果存在边u->v,那么在序列中u一定在v前面,这个序...转载 2019-03-18 09:27:10 · 1141 阅读 · 0 评论