算法 数据结构
文章平均质量分 66
taxue505
网络 信息安全 互联网
展开
-
7_TwoDimensionalArray
//二维数组的创建、查询、销毁int **create(int m,int n){ int **arr=new int*[m]; for(int i=0;i<m;i++) { arr[i]=new int[n]; } return arr;}int search(int **arr,int m,int n,int...原创 2018-03-26 19:42:48 · 413 阅读 · 0 评论 -
海量数据处理——倒排索引
一,什么是倒排索引问题描述:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。 以英文为例,下面是要被索引的文本: T0 = "it is what it is" T1 = "what is it" T2 =转载 2016-08-10 16:11:30 · 3715 阅读 · 0 评论 -
海量数据处理——分治和hash映射
什么是Hash Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数原创 2016-08-10 16:06:03 · 17474 阅读 · 2 评论 -
海量数据处理——位图法bitmap
一、定义 位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。在STL中有一个bitset容器,其实就是位图法,引用bitset介绍:A bitset is a special container class that is designed to store b转载 2016-08-10 15:58:15 · 11962 阅读 · 1 评论 -
海量数据处理——布隆过滤器
布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素转载 2016-08-10 15:28:19 · 829 阅读 · 0 评论 -
草原坝上滑梯
草原坝上滑梯 只能从上下左右侧移动 输入:行数R 列数C 输出:最长区域的长度 样例: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 输出:25#include <iostream>#include <algorithm>using namespace std;原创 2016-08-28 22:25:45 · 1018 阅读 · 1 评论 -
二分查找
二分查找1、二分查找(Binary Search) 二分查找又称折半查找,它是一种效率较高的查找方法。 二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。2、二分查找的基本思想 二分查找的基本思想是:(设R[low..high]是当前的查找区间) (1)首先确定该区间的中点位置:原创 2016-07-30 11:55:59 · 867 阅读 · 0 评论 -
原地归并排序
一般在提到Merge Sort时,大家都很自然地想到Divide-and-Conqure, O(n lgn)的时间复杂度以及额外的O(n)空间。O(n)的extra space似乎成了Merge Sort最明显的缺点,但实际上这一点是完全可以克服的,也就是说,我们完全可以实现O(n lgn) time 以及 O(1) space 的Merge Sort。对于这种不用额外空间(即常数大小的额原创 2016-07-30 08:58:17 · 1088 阅读 · 1 评论 -
bwlabel.cpp
////////////bwlabel.cpp#include "cv.h"#include "highgui.h"#define NO_OBJECT 0#define MIN(x, y) (((x) < (y)) ? (x) : (y))#define ELEM(img, r, c) (CV_IMAGE_ELEM(img, unsi原创 2016-07-19 21:53:22 · 349 阅读 · 0 评论 -
五大经典算法
分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的转载 2016-07-19 16:11:52 · 1129 阅读 · 0 评论 -
通过金矿模型介绍动态规划
通过金矿模型介绍动态规划点击下载01背包测试数据.rar 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让转载 2016-07-19 15:52:02 · 367 阅读 · 0 评论 -
动态规划:从新手到专家
作者:Hawstein出处:http://hawstein.com/posts/dp-novice-to-advanced.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。前言本文翻译自TopCoder上的一篇文章: Dynamic Programmin转载 2016-07-19 10:07:28 · 206 阅读 · 0 评论 -
字符串编辑距离(相似度)
编辑距离及编辑距离算法编辑距离概念描述:编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:sitten (k→s)sittin (e→i)sitting (→g)俄罗斯科学家Vladimir Leven原创 2016-07-18 22:06:23 · 790 阅读 · 0 评论 -
动态规划之最长递增子序列
最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维,我对这个问题进行了较深入的分析思考,得出了几种复杂度不同算法,并给出了分析和证明。一, 最长递增子序列问题的描述设L=a1,a2,…,an>是n个不同原创 2016-07-18 16:45:13 · 1199 阅读 · 0 评论 -
海量数据处理常用思路和方法
1.Bloom filter 适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。转载 2016-08-10 16:14:03 · 492 阅读 · 0 评论 -
海量数据处理问题汇总及方法总结
面试题中总是有好多海量数据的处理问题,在这里列出一些常见问题,便于以后查阅: 类型1:hash映射+hash统计+堆排序1、 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。 可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治转载 2016-08-10 16:16:09 · 2857 阅读 · 1 评论 -
6_BinarySearch
//[2 4 5 6 8 10 12 14 17 19] 5#include<iostream>using namespace std;int search(int array[], int len, int value){ int low=0,high=len-1; while(low<=high) { //int m...原创 2018-03-16 21:35:38 · 332 阅读 · 0 评论 -
5_JumpOutArrary
/*DP动态规划一个数组,每个位置的数字代表当前位置可以向前走的步长,判断该数组能否跳出数组之外case1 :[1,3,1,1,1,2] true// [1,4,4,4,5,5]case2 :[1,2,1,1,0,2] falsecase3 :[1,3,1,3,0,2] true*/#include<iostream>using namespace std...原创 2018-03-16 21:23:07 · 340 阅读 · 0 评论 -
3_Add Two Numbers
//Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)//Output: 7 -> 0 -> 8//Explanation: 342 + 465 = 807.#include<iostream>using namespace std;struct ListNode { int val; ListN...原创 2018-03-10 08:25:06 · 264 阅读 · 0 评论 -
2_shift_left
//0 1 2 3 4 5 6 7//1 2 3 4 5 6 7 0//2 3 4 5 6 7 0 1#include<iostream>#include<vector>using namespace std;void reverse_arr(vector<int>&vec,int start,int end){ for(;st...原创 2018-03-10 08:23:52 · 787 阅读 · 0 评论 -
1_two_sum
//数组:2 6 7 11 4 3 目标:9//下标:0 1 2 3 4 5//位置:1 2 3 4 5 6//当前元素依次往后遍历,在前边元素中找(target-当前元素)/*2 76 32 06 1*/#include<iostream>#include<vector>#include<map>using n...原创 2018-03-10 08:21:14 · 254 阅读 · 0 评论 -
4_Longest Substring Without Repeating Characters
//abcabcbb abc 3//bbbbb b 1//pwwkew wke 3#include<iostream>#include<string>#include<vector>using namespace std;int lengthOfLongestSubstring(string s...原创 2018-03-14 20:27:54 · 335 阅读 · 0 评论 -
构造回文
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000. 输出描述:对于每组数据,输出一个整数,代表最少需要删除的字符个数。输入例子:abcdagoogle原创 2016-08-25 22:50:36 · 716 阅读 · 0 评论 -
线索二叉树
一、线索二叉树的原理 通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。 因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。 记ptr指向二叉链表中的一个结点,以下是建立线索的规原创 2016-08-13 14:59:20 · 603 阅读 · 0 评论 -
二叉树中节点的最大的距离
问题定义把二叉树看成一个图,父子节点之间的连线看成是双向的,定义“距离”为两个节点之间的边数。例如下图中最大距离为红线的条数为6.分析方法一、typedef struct Node { struct Node *pleft; //左孩子 struct Node *pright; //右孩子原创 2016-08-12 21:33:41 · 5254 阅读 · 0 评论 -
Morris Traversal方法遍历二叉树
本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求:1. O(1)空间复杂度,即只能使用常数空间;2. 二叉树的形状不能被破坏(中间过程允许改变其形状)。通常,实现二叉树的前序(preorder)、中序(inorder)、后序(postorder)遍历有两个常用的方法:一是递归(recursive),二是使用栈实现的迭代版本(stack+iterative)。这转载 2016-08-12 18:09:27 · 1242 阅读 · 0 评论 -
图解后缀表达式的计算过程
为了解释后缀表达式的好处,我们先来看看,计算机如何应用后缀表达式计算出最终的结果20的。后缀表达式:9 3 1-3*+ 10 2/+规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。下面是详细的步骤:1. 初始化一个空栈。此桟用来对要运算的数字进出使用。转载 2016-08-11 22:51:11 · 25774 阅读 · 2 评论 -
将中缀表达式转化为后缀表达式
我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2"叫做中缀表达式。因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化。中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+”规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号转载 2016-08-11 22:39:15 · 1327 阅读 · 1 评论 -
海量数据处理——trie树
1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是转载 2016-08-11 16:31:00 · 1266 阅读 · 0 评论 -
最大子序列
最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序列。原创 2016-07-18 17:16:27 · 613 阅读 · 0 评论 -
动态规划之最长公共子串
子字符串的定义和子序列的定义类似,但要求是连续分布在其他字符串中。比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2。Longest Common Substring和Longest Common Subsequence是有区别的 X = Y = X和Y的Longest Common Sequ原创 2016-07-18 20:28:51 · 610 阅读 · 0 评论 -
快速排序
一、快速排序的介绍快速排序是一种排序算法,对包含n个数的输入数组,最坏的情况运行时间为Θ(n2)[Θ 读作theta]。虽然这个最坏情况的运行时间比较差,但快速排序通常是用于排序的最佳的实用选择。这是因为其平均情况下的性能相当好:期望的运行时间为 Θ(nlgn),且Θ(nlgn)记号中隐含的常数因子很小。另外,它还能够进行就地排序,在虚拟内存环境中也能很好的工作。和归并排序一样,快速排序也是基于分治原创 2015-09-14 20:42:01 · 3420 阅读 · 0 评论 -
选择算法
1. 概念顺序统计量:在一个由n个元素组成的集合中,第i个顺序统计量是指该集合中第i小的元素。例如最小值是第1个顺序统计量,最大值是第n个顺序统计量。中位数:一般来说,中位数是指它所在集合的“中间元素”,当n为奇数时,中位数是唯一的,出现位置为n/2;当n为偶数时候,存在两个中位数,位置分别为n/2(上中位数)和n/2+1(下中位数)。选择问题: 输入:一个包含n个(不同的)数的集合A和一个数i原创 2015-09-15 09:54:52 · 529 阅读 · 0 评论 -
桶排序
桶排序是另外一种以O(n)或者接近O(n)的复杂度排序的算法. 它假设输入的待排序元素是等可能的落在等间隔的值区间内.一个长度为N的数组使用桶排序, 需要长度为N的辅助数组. 等间隔的区间称为桶, 每个桶内落在该区间的元素. 桶排序是基数排序的一种归纳结果算法的主要思想: 待排序数组A[1…n]内的元素是随机分布在[0,1)区间内的的浮点数.辅助排序数组B[0….n-1]的每一个元素都连接一个链表.原创 2015-09-14 16:03:34 · 354 阅读 · 0 评论 -
基数排序
基数排序(radix sort)则是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排原创 2015-09-12 23:11:25 · 734 阅读 · 0 评论 -
基数排序2
基数排序编程论到极致,核心非代码,即思想。所以,真正的编程高手同时是思想独到及富有智慧(注意与聪明区别)的人。每一个算法都是一种智慧的凝聚或萃取,值得我们学习从而提高自己,开拓思路,更重要的是转换思维角度。其实,我们大多数人都活在“默认状态”下。没有发觉自己的独特可设置选项—–思想。言归正传(呵呵!恢复默认状态),以下学习基数排序。【1】基数排序以前研究的各种排序算法,都是通过比较数据大小的方法对欲转载 2015-09-14 14:36:57 · 439 阅读 · 0 评论 -
计数排序
计数排序是一个类似于桶排序的排序算法,其优势是对已知数量范围的数组进行排序。它创建一个长度为这个数据范围的数组C,C中每个元素记录要排序数组中对应记录的出现个数。这个算法于1954年由 Harold H. Seward 提出。计数排序是一种算法复杂度 O(n) 的排序方法,适合于小范围集合的排序。比如100万学生参加高考,我们想对这100万学生的数学成绩(假设分数为0到100)做个排序。我们如何设计原创 2015-09-12 22:44:33 · 638 阅读 · 0 评论 -
Strassen矩阵乘法
有用资料此链接Strassen算法的原理讲解的更加透彻http://www.ituring.com.cn/article/17978矩阵乘法的定义矩阵乘法,A*B=C,其中:那么乘法的定义呢??A矩阵的一行与B矩阵的一列点乘和为C的一个元素。用图形表示是最直观的,其定义就如下图:基本矩阵乘法那么由上面图中的公式,我们很容易得到基本矩阵相乘的伪代码:for i = 1 to col // row原创 2015-09-12 11:33:09 · 1685 阅读 · 0 评论 -
二分查找
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上原创 2015-09-11 13:50:55 · 346 阅读 · 0 评论 -
插入排序
插入排序的基本思想:每次从未排序的序列中取一个元素,插入到已经排好序的序列的合适位置。小规模输入来说,插入排序速度比较快。许多复杂的排序法,在规模较小的情况下,都使用插入排序法来进行排序。数组的插入排序算法如下:#include<iostream>using namespace std;void InsertSort(int array[], int length){ for (int j原创 2015-09-11 10:43:36 · 442 阅读 · 0 评论