算法
sole_cc
这个作者很懒,什么都没留下…
展开
-
如何高效产生m个n范围内的不重复随机数(m<=n)
如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些比较是多余的,完全可以不进行比较,只要反过来,按顺序产生这些数,但随机产生它们的位置。例如下面产生100个100以内不重复随机数的代码:int a[100];for(i=0; ifor(i=99; i转载 2015-08-16 17:48:29 · 843 阅读 · 0 评论 -
0-1背包问题
题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i转载 2015-09-06 16:14:43 · 443 阅读 · 0 评论 -
动态规划经典五题
DP一年多没碰过了,今天突然想找找感觉,找了经典的几道DP复习着敲了敲。虽然最大子矩阵,滑雪,石子合并等问题也足够经典,我还是从中找了5道最经典的DP写了这篇博文,如果您是大一,大二想踏入程序竞赛的同学可以当习题做做,如果您像我一样不是ACMer,平时项目中也很少用DP,同样可以回顾一下DP的奥妙。1.最大连续子序列之和给定K个整数的序列{ N1, N2, ..., NK },其任转载 2015-03-06 17:22:14 · 528 阅读 · 0 评论 -
十道海量数据处理面试题与十个方法大总结
摘要:本文将向您讲述诸多数据处理面试题以及方法的总结。 第一部分、十道海量数据处理面试题 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 此题,在我之前的一篇文章算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。 再详细介绍下此方案:首先是这一天,并且是访转载 2015-05-02 22:03:35 · 507 阅读 · 0 评论 -
海量数据处理算法—Bloom Filter
1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有转载 2015-10-16 21:08:34 · 438 阅读 · 0 评论 -
P、NP、NPC和NP-Hard问题的通俗化解释和详细区分
你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并不是那种“只有搜才行”的问题,NPC问题才是。好,行了,基本上这个误解已经被澄清了。下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC问题,你如果不是很感兴趣就可以不转载 2015-10-02 11:57:15 · 2077 阅读 · 0 评论 -
全排列字典序与序号的一一对应关系 康托展开 perm2num num2 perm
康托展开 康托展开的公式是 X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,ai为当前未出现的元素中是排在第几个(从0开始)。 这个公式可能看着让人头大,最好举个例子来说明一下。例如,有一个数组 s = ["A", "B", "C", "D"],它的一个排列 s1 = ["D", "B", "A", "C"],现在要原创 2015-10-03 17:58:29 · 1383 阅读 · 0 评论 -
Trie树:应用于统计和排序
1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时转载 2015-10-06 19:47:46 · 551 阅读 · 0 评论 -
Trie树和其它数据结构的比较
Trie树,又叫做前缀树或者是字典树,是一种有序的树。从空字符串的根开始,往下遍历到某个节点,确定了对应的字符串,也就是说,任意一个节点的所有子孙都具备相同的前缀。每一棵Trie树都可以被看做是一个简单版的确定有限状态的自动机(DFA,deterministic finite automaton),也就是说,对于一个任意给定的属于该自动机的状态(①)和一个属于该自动机字母表的字符(②),都可以转载 2015-10-07 14:42:47 · 408 阅读 · 0 评论 -
2sum,3sum,4sum问题总结
K Sum Problem Series: (中文旧版)前言:做过leetcode的人都知道, 里面有2sum, 3sum(closest), 4sum等问题, 这些也是面试里面经典的问题, 考察是否能够合理利用排序这个性质, 一步一步得到高效的算法. 经过总结, 本人觉得这些问题都可以使用一个通用的K sum求和问题加以概括消化, 这里我们先直接给出K Sum的问题描述和算法转载 2015-05-23 20:42:42 · 1091 阅读 · 0 评论 -
一致性hash算法 - consistent hashing
consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在cache 系统中应用越来越广泛;1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object转载 2015-05-14 10:52:44 · 388 阅读 · 0 评论 -
一致性hash算法(二)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到转载 2015-05-14 11:01:04 · 479 阅读 · 0 评论 -
常见排序算法的实现与性能比较
插入排序直接插入排序时间复杂度O(n^2), 空间复杂度O(1)排序时间与输入有关:输入的元素个数;元素已排序的程度。最佳情况,输入数组是已经排好序的数组,运行时间是n的线性函数(O(n)); 最坏情况,输入数组是逆序,运行时间是n的二次函数(O(n^2))。介绍:插入排序的工作原理是,对于每个未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。转载 2015-03-22 10:23:41 · 805 阅读 · 0 评论 -
动态规划:从新手到专家
March 26, 2013作者:Hawstein出处:http://hawstein.com/posts/dp-novice-to-advanced.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。前言本文翻译自TopCoder上的一篇文章:转载 2015-03-06 16:45:38 · 425 阅读 · 0 评论 -
基于B-树和B+树的使用:数据搜索和数据库索引的详细介绍
B-树1 .B-树定义B-树是一种平衡的多路查找树,它在文件系统中很有用。定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树;⑵若根结点不是叶子结点,则至少有两棵子树;⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树;⑷所有的非终端结点中包含以下信息数据:(n,A0,K1,A1,K2,…,Kn,An)其中:转载 2015-03-28 15:23:36 · 937 阅读 · 0 评论 -
二叉树遍历之递归算法
二叉树的遍历算法有多种,典型的有先序遍历、中序遍历、后序遍历以及层序遍历。而且这些遍历的递归算法较为简单,代码很少,容易实现,本文就是汇总二叉树遍历的递归算法,非递归算法将在下一篇文章中进行总结。本文中用到的二叉树实例如下: 3 / \ 9 20 / \ 15 7二叉树定义和辅助函数如下:[转载 2015-04-01 09:15:22 · 578 阅读 · 0 评论 -
二叉树遍历之非递归算法
在前一篇文章二叉树遍历递归算法对二叉树遍历的递归算法做了总结,这篇文章就来对二叉树遍历的非递归算法做个汇总。还是与上一篇文章一样的顺序,一一汇总先序、中序、后序以及层序遍历的非递归算法。1、先序遍历(非递归算法)先序遍历非递归访问,使用栈即可实现。先序遍历的非递归访问在所有的遍历中算是最简单的了。主要思想就是先将根结点压入栈,然后根结点出栈并访问根结点,而后依次将根结点的右转载 2015-04-01 09:20:26 · 717 阅读 · 1 评论 -
五大常用算法之四:回溯法
1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。转载 2015-04-12 20:04:43 · 443 阅读 · 0 评论 -
字符串匹配那些事(一)
本系列文章主要介绍几种常用的字符串比较算法,包括但不限于蛮力匹配算法,KMP算法,BM算法,Horspool算法,Sunday算法,fastsearch算法,KR算法等等。本文主要介绍KMP算法和BM算法,它们分别是前缀匹配和后缀匹配的经典算法。所谓前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从左到右;所谓后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右。看得出来转载 2015-05-03 09:31:08 · 551 阅读 · 0 评论 -
KMP算法详解
个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有 所收获的~~,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊:KMP字符串模式匹配详解KMP字符串模式匹配通俗点说就转载 2015-05-03 10:10:31 · 538 阅读 · 0 评论 -
字符串匹配:蛮力、KMP
前两篇文章是从网上搜索的,知道了next数组可以有多种表示方法,但感觉KMP算法详解里面第二种表示法给的程序有点小问题,今天自己改进了下,然后在leetcode(strStr)上验证了下,发现自己改进的程序可以AC,证明没有问题现在在这篇博客中总结蛮力、KMP、BM算法的各种AC解法:蛮力法:耗时6ms(cpp)class Solution {public: int strS原创 2015-05-03 14:01:49 · 636 阅读 · 0 评论 -
五大常用算法之二:动态规划算法
五大常用算法之二:动态规划算法一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的转载 2015-03-06 16:00:16 · 403 阅读 · 0 评论