
基础算法数据结构
邪恶牛犊
只是一个准备考研才发现,自己好菜的,在准备蓝桥杯和pat的学渣。。。。。
展开
-
贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。一、贪婪算法可解决的问题通常大部分都有如下的特性: 随着算法的进行,将积累起其它两原创 2017-11-27 10:39:03 · 415 阅读 · 0 评论 -
字符串hash函数比较
/// @brief BKDR Hash Function /// @detail 本 算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得 名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)。 template<class T>转载 2017-12-04 15:01:34 · 333 阅读 · 0 评论 -
通过BKDRHASH将字符串转化为数值类型
似乎很多题目里有任务啊什么的代号是字符串,会增加内存开销和用时,把它们全部转化成int就会好很多,然后研究了一会发现有很多字符串的hash函数,这个BKDRHASH相对还不错,就记录下来。unsigned int bkdr_hash(const char *str) { unsigned int seed = 131; // the magic number, 31, 131原创 2017-12-04 14:43:34 · 923 阅读 · 0 评论 -
暴雪公司经典的字符串的hash公式
简单的一个思想暴雪公司有个经典的字符串的hash公式http://hi.baidu.com/ridgehk/item/8e82e5c8f550f3daef183b3e 先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做? 有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把转载 2017-12-04 15:27:21 · 336 阅读 · 0 评论 -
二叉搜索树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。 原理:二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。中序遍历二叉排序树可得原创 2017-12-07 09:54:35 · 352 阅读 · 0 评论 -
Havel-Hakimi定理
Havel定理描述 给定一个非负整数序列{d1,d2,…dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化。进一步,若图为简单图,则称此序列可简单图化。(顶点的度是指与该顶点相铃的顶点数) 可图化的判定比较简单:d1+d2+…dn=0(mod2)。关于具体图的构造,我们可以简单地把奇数度的点配对,剩下的全部搞成自环。 可简单图化的判定,有一个Havel定理,是说:原创 2017-12-25 10:06:29 · 3268 阅读 · 0 评论 -
线段树
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单原创 2017-12-25 10:28:24 · 166 阅读 · 0 评论 -
动态规划之背包问题
1、问题描述 已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]。 条件:每种物品都有无限件,能放多少就放多少。 问题:在不超过背包容量的情况下,最多能获得多少价值或收益2、看到这个问题,可能会想到贪心算法,但是贪心其实是不对的。例如最少硬币找零问题,要用动态规划。动态规划思想就是解决子问题并记录子问题的解,这样就不用重复解决子问题了。所以贪心用到原创 2017-11-28 11:35:50 · 263 阅读 · 0 评论 -
已知后序与中序输出前序(先序)
已知后序与中序输出前序(先序) 已知后序与中序输出前序(先序): 后序:3, 4, 2, 6, 5, 1(左右根) 中序:3, 2, 4, 1, 6, 5(左根右) 分析:因为后序的最后一个总是根结点,令i在中序中找到该根结点,则i把中序分为两部分,左边是左子树,右边是右子树。因为是输出先序(根左右),所以先打印出当前根结点,然后打印左子树,再打印右子树。左子树在后序中的根结点为root –转载 2017-11-06 10:21:44 · 563 阅读 · 0 评论 -
关于DFS,BFS
我发现这几个用的好多啊。。。。DFS 深度优先遍历,也就是遍历图或者数深度优先,感觉只要是个问题都要用到,一般问题都是问一条线,就是深度遍历一下就解决了吧。#include <cstdio>#include <vector>#include <algorithm>using namespace std;vector<int> v[100];int book[100], maxdepth原创 2017-11-06 10:56:52 · 183 阅读 · 0 评论 -
Dijkstra算法
迪杰斯特拉算法我觉得这是用的最多的最短路径优先算法了吧。我理解的这种算法就是两个集合,首先从你的起点开始是一个集合s,其他的顶点为一个集合v,开始遍历,查找所有顶点到起点的路径,选取最短的点把它归入s中,并记录下当前的到所有点的最短路径,然后起点就换成之前选出的那个店,再去和剩下的顶点遍历,找出剩下距离最短的,把距离之和和最短路径比较得出更小的。直到所有的点都到s集合中去。#include <ios原创 2017-11-06 18:39:21 · 192 阅读 · 0 评论 -
RC4加密解密实现
首先引用下别人的图吧很清晰的流程图,加密解密都是同一个密钥流实现的。1、第一步是生成S盒 初始化S和T 开始时,S中元素的值被置为按升序从0到255,即S[0]=0,S[1]=1,…,S[255]=255。同时建立一个临时矢量T(长度与S相同)。如果密钥K的长度为256字节,则将K赋给T(K的长度为可能小于S的长度)。否则,若密钥长度为keylen字节,则将K的值赋给T的前keylen个元素,原创 2017-11-22 11:31:27 · 4711 阅读 · 0 评论 -
大整数相加
emmm,在玩游戏,连跪的时候,学弟学妹oj大赛,匹配间隙写个吧。。。#include <iostream>#include <algorithm>#include <string>using namespace std;#define maxsize 20string add (string s,string t) { int len = s.length (), carry =原创 2017-11-10 23:23:42 · 316 阅读 · 0 评论 -
关于sort排序
C++STL中就自带了排序函数sortsort 对给定区间所有元素进行排序 要使用此函数只需用#include sort即可使用,语法描述为:#include <algorithm>#include <iostream>int main()sort(begin,end){ int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i+原创 2017-11-10 13:04:50 · 267 阅读 · 0 评论 -
二分法查找
以数值类型为例,就是在有序的数组中,不断的用中值和目标对比,mid比目标大,那么说明right大要缩小,反之,mid比目标小,就要提高left,让mid变大。long long binarySearch(long long n[], long long left, long long right, long long t) { long long mid; while(left <原创 2017-11-10 12:51:49 · 255 阅读 · 0 评论 -
素数
没啥好说的就是素数 今天满课。。。。。。#include <cstdio>#include <cmath>using namespace std;bool isprime(int n) { if(n <= 1) return false; int sqr = int(sqrt(n * 1.0)); for(int i = 2; i <= sqr; i++) {原创 2017-11-08 22:43:39 · 193 阅读 · 0 评论 -
C++ set集合
Setset集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等,使用中序遍历可将键值按照从小到大遍历出来。构造set集合主要目的是为了快速检索,不可直接去修改键值。(constructor) Construc原创 2017-11-07 10:29:18 · 444 阅读 · 0 评论 -
红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 红黑树和AVL树类似,原创 2017-11-07 10:06:59 · 336 阅读 · 1 评论 -
关于求无向图的连通分量的个数
emmm,我能说这个我看了好久才理解的么,似乎有两种方法,dfs和并查集,先搞懂一个能用就行了吧。一开始我完全不理解为啥深度遍历了一下,就能count++下去了,后来想了一下,从起点开始循环,到每一个顶点的深度优先遍历一下,那么没有一个没有遍历到的顶点那么这不就是一个新的分支么,深度优先遍历过一次的就是一个连通分量。也许过几天我自己又理解不了了,总之就是一个为访问的顶点就是一个新的分支。#inclu原创 2017-11-06 19:43:57 · 12549 阅读 · 3 评论 -
欧拉路径
首先是定义: 给定一个无向图G,一条路径经过图G的每一条边,且仅经过一次,这条路径称为欧拉路径(Eulerian Tour),如果欧拉路径的起始顶点和终点是同一顶点,则称为欧拉回路(Eulerian circuit). 然后看看两个定理: 定理一:连通的无向图有欧拉路径的充要条件是: G中奇顶点(连接的边数量为奇数的顶点)的数目等于0或者2。连通的无向图是欧...原创 2018-04-25 10:32:56 · 455 阅读 · 0 评论