算法
文章平均质量分 57
战争学院
祖国的花朵
展开
-
字符串类型的算法面试
字符串类型的算法面试题特点 1. 广泛性 1.字符串可以看做字符类型的数组与数组排序、查找、调整有关 2.很多其它类型的面试题可以看做字符串类型的面试题 注意:用JAVA实现字符串类型的题目是,由于java.lang.String类型不可修改,我们可以使用StringBuffer,StringBuileder类和toCharArray方法。 2. 需掌握的概念原创 2015-11-20 10:23:38 · 764 阅读 · 0 评论 -
小范围排序
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。 测试样例: [2,1,4,3,6,5,8,7,10,9],10,2 返回:[1,2,3,4,5,6,7,8,9,10]分析:<1>首先分析时间复杂度原创 2016-03-04 10:25:48 · 458 阅读 · 1 评论 -
一致性hash算法释义
一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。 但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存数转载 2016-03-21 19:56:09 · 330 阅读 · 0 评论 -
LRU缓存实现(Java)
http://www.cnblogs.com/lzrabbit/p/3734850.htmlLRU缓存实现(Java)LRU Cache的LinkedHashMap实现LRU Cache的链表+HashMap实现LinkedHashMap的FIFO实现调用示例LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,LRU转载 2016-04-12 21:20:58 · 255 阅读 · 0 评论 -
动态规划算法
动态规划算法一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求转载 2016-04-13 15:13:10 · 195 阅读 · 0 评论 -
贪心算法
贪心算法一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前转载 2016-04-13 15:27:31 · 207 阅读 · 0 评论 -
回溯法
回朔法1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”转载 2016-04-13 15:32:44 · 289 阅读 · 0 评论 -
分支限界法
分支限界法一、基本描述 类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。 (1)分支搜索算法转载 2016-04-13 15:37:26 · 219 阅读 · 0 评论 -
分治算法
分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的转载 2016-04-13 15:07:15 · 187 阅读 · 0 评论 -
位运算——用位存储40亿个40亿以内的整数
http://www.cnblogs.com/steven_oyj/archive/2010/05/23/1741975.html腾讯面试题:位运算——用位存储40亿个40亿以内的整数一、题目位运算——用位存储40亿个40亿以内的整数 1: #include 2: using namespace std; 3:转载 2016-04-13 15:49:02 · 655 阅读 · 0 评论 -
查找——图文翔解HashTree(哈希树)
引在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。之前我们介绍的各种基于比较的树查找算法,这些查找算法的效率都将随着数据记录数的增长而下降。仅仅是有的比较慢(时间复杂度为O(n)),有的比较快(时间复杂度是O(log转载 2016-04-14 00:01:26 · 558 阅读 · 0 评论 -
八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,转载 2016-04-14 00:29:51 · 260 阅读 · 0 评论 -
子集和问题
思路:假设集合S(A,B,C,D),其大小为4,拥有2的4次方个子集,即0-15,二进制表示为0000,0001,...,1111。对应的子集为空 集,{D},...,{A,B,C,D}。步骤:1,求出从0到集合子集数目之间的数的二进制形式 2,根据求的二进制形式,把集合中在二进制字符串中对应数字为的1的元素取出来,为一个子集。转载 2016-08-07 09:07:29 · 282 阅读 · 0 评论 -
基数排序 (Radix Sort)
算法原理 ——————————————————————————————————— 基数排序 (Radix Sort) 是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。 ———— 排序过程:将所有待比较数值(必须是正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序;然后从桶中倒出所有数,完成一次排序;依次迭代到高位原创 2015-12-07 15:56:10 · 498 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
绝对最佳答案及分析:public class sumOf1 {public int NumberOf1(int n) {int result = 0;char[] s = Integer.toBinaryString(n).toCharArray();for (int i = 0; i if(s[i] == '1'){result++;}}原创 2015-12-15 22:17:39 · 336 阅读 · 0 评论 -
快速排序
快速排序总结出来就是 挖坑填数 + 分治法系统写好的快排算法,所选取的基数用的是随机数法,初始化时随机一个数作为基准。 对于数组a[R-1],用双指针解决这个问题,具体步骤:1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。 2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。 3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。 4.再重复执原创 2015-11-24 15:34:02 · 287 阅读 · 0 评论 -
Int[]数组与List的相互转化,String[]数组与List的相互转化
遍历的办法肯定亦可以做到相互转化,但是遍历起来代码量多,本文使用java.util.Arrays类中自带的方法可以方便的实现该功能。Int[]数组转为List,String[]数组转为List 查看api文档可以发现java.util.Arrays类中自带的方法asList() public static List asList(T… a)返回一个受指定数组支持的固定大小的列表。(对原创 2015-11-24 15:47:22 · 3360 阅读 · 2 评论 -
java 内存溢出问题以及 java内存简单机制
java内存简单介绍 java中常用的内存区域 在java中主要存在4块内存空间,这些内存的名称及作用如下: 1.栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址) 2.堆内存空间:保存每个对象的具体属性内容。 3.全局数据区:保存static类型的属性。 4.全局代码区:保存所有的方法定义。另一种介绍,简单的把java把原创 2015-11-24 15:54:38 · 354 阅读 · 0 评论 -
时间复杂度的三种不同表示
O(f(n)),给出了算法运行时间的上界,也就是最坏情况下的时间复杂度; Ω(f(n)),给出了算法运行时间的下界,也就是最好情况下的时间复杂度; Θ(f(n)),给出了算法运行时间的上界和下界,这里Θ(f(n))是渐近的确界, 另外,并非所有的算法都有Θ(f(n))。原创 2015-11-20 16:41:48 · 4321 阅读 · 0 评论 -
斐波那契数列算法分析
背景:假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖,如此这般持续下去。每只雌兔在开始繁殖时每月都产下一对兔子,假定没有兔子死亡,在一年后总共会有多少对兔子?在一月底,最初的一对兔子交配,但是还只有1对兔子;在二月底,雌兔产下一对兔子,共有2对兔子;在三月底,最老的雌兔产下第二对兔子,共有3对兔子;在四月底转载 2015-12-15 21:46:33 · 332 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
两种办法: 其一:简单的转换成2进制数进行遍历 其二:通过与其差一位的数进行与运算,统计运算次数 原理:如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后原创 2015-12-15 22:19:38 · 1536 阅读 · 0 评论 -
吸血鬼数字(一个4位数字,可以拆分2个2位数数字的乘积,顺序不限。)
首先介绍下吸血鬼数字的特性: 一个4位数字,可以拆分2个2位数数字的乘积,顺序不限。后面是两个0的不算,比如3000=50*60举例: *15*93=1395 21*60=1260 21*87=1827*代码实现import java.util.Arrays;/** * 一个4位数字,可以拆分2个2位数数字的乘积,顺序不限。 * 比如 1395 =15 * 93 */public cl原创 2015-12-16 21:28:18 · 826 阅读 · 0 评论 -
链表翻转非递归实现
通过dummy,current两个节点来实现非递归的实现,主要思路就是每次遍历一个节点,让current的节点首先指向之前的dummy节点,然后dummy节点再指向current节点,current节点继续向后遍历。//非递归 public ListNode1 ReverseListZcf(ListNode1 head) { if(head == null) return he原创 2015-12-16 17:08:03 · 295 阅读 · 0 评论 -
堆排序-java实现
堆排序主要的过程就是建立大顶堆或者小顶堆,然后调整堆,最后进行堆排序。 ①建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,相当于o(h1)+o(h2)…+o(hlen/2) 其中h表示节点的深度,len/2表示节点的个数,这是一个求和的过程,结果是线性的O(n)。 ②调整堆:调整堆原创 2015-12-01 09:09:53 · 312 阅读 · 0 评论 -
希尔排序-shellSort java实现
希尔排序的实质就是分组插入排序,如何选取关键字,选取关键字是希尔排序的关键。 其实就是两步: <1>取步长,然后对每一个步长内的数字进行排序 <2>改变步长,重复步骤一 <3>直到步长为1public static int[] shellSort(int[] A,int n){ i原创 2015-12-01 11:21:13 · 395 阅读 · 0 评论 -
计数排序
思路: 首先: 计算出待排序数组中最大值max与最小值min的差距,建立一个桶数组count; 其次: 用count数组的下标i来表示与最小值的差距,count[i]中来存待排序数组中有多少个与最小值的差距 最后: 我们知道count的下标i是表示与最小值的差距,所以说i+min就代表待排序数组中的原始值,count[i]表示统计原数组中与最小值差距为i的数目,所以可以根据这两点将count[原创 2015-12-01 19:18:56 · 331 阅读 · 0 评论 -
经典排序稳定性、时间空间复杂度分析
首先我们介绍下桶排序,桶排序主要包括计数排序和基数排序 计数排序采用桶排序的思想如下图: 基数排序: 首先根据个位数的大小将一组数放入0-9的桶排序中,然后从0-9号桶倒出所有的数;再次根据十位上的数,放入0-9号桶;直至最后到最高位的数进行放入0-9号桶,最后取出。经典排序算法的空间复杂度: O(1):插入排序、选择排序、冒泡排序、堆排序、希尔排序; O(logN)~O(N):快速排原创 2015-12-01 15:45:47 · 320 阅读 · 0 评论 -
贪心算法基本思想和典型例题
0推荐━━━━━━━━━━━━━━━━━━━━━━━━━一、算法思想 贪心法的基本思路: 从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。 该算法存在问题: 1. 不能保证求得的最后解是最佳的; 2. 不能用来求最大或最小解问题; 3. 只能求满足某些约束条件的可行转载 2016-08-07 09:42:51 · 1819 阅读 · 0 评论