算法分析
llianlianpay
快来吐槽
展开
-
1、二分查找法
二分查找算法 1.二分查找又称折半查找,它是一种效率较高的查找方法。 2.二分查找要求:(1)必须采用顺序存储结构 (2)必须按关键字大小有序排列 3.原理:将数组分为三部分,依次是前值,中值,后值;将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。 4.实现:二分查找...原创 2018-04-10 20:52:04 · 265 阅读 · 0 评论 -
2、栈&队列&链表
在java中,常见于集合如List这种写法,就是确保一个集合内的所有对象是属于一个类型的。算术表达式的存储如何让一个算术表达式正确的执行? 5 +2*3 +4/2 E.W.Dijkstra在上世纪60年代发明了一种简单的存储方法,使用2个栈,一个用来保存数字,一个用来保存运算符号;1、将数字压入 数字栈2、将运算符号压入 符号栈3、忽略左括弧4、遇到右括弧时...原创 2018-04-11 00:06:42 · 190 阅读 · 1 评论 -
4、查找
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。查找算法 顺序查找 二分查找1、二叉树 时间复杂度和高度成正比 2、平衡二叉树 时间复杂度为log2n 3、红黑树 时间复杂度为log2n,但自旋转较少。 4、b树/b...原创 2018-04-12 00:03:26 · 143 阅读 · 0 评论 -
15、2016校招腾讯研发岗笔试题(第二题)用Java实现
有下图的题解,请用 C/C++ 代码来列出满足下图 0-100 内的所有答案。 分析: a1+a2-9=4 (1)a4-a5*a6=4 (2)a7+a8-a9=4 (3)a1+a4/a7=4 (4)a2-a5*a8=4 (5)9-a6-a9=4 (6) 分析上面六个式子,由方程(4)则a1<...转载 2018-04-17 10:57:08 · 327 阅读 · 0 评论 -
14、约瑟夫环
已知n个人围坐在一张圆桌周围,从编号为1的人开始报数,数到m的那个人出列。下一个人从1开始报数,数到m的人继续出列,以此类推直至全部人出列。求出列顺序?解决方案:1、最简单明了的办法就是用循环链表存储这n个人。数到m的人出列,只需将该结点从链表里剔除即可,然后继续往后报数,直到链表只剩下一个结点时结束。具体代码如下:typedef struct People { ...转载 2018-04-17 10:33:37 · 171 阅读 · 1 评论 -
13、大整数操作
long型数据最大能对21亿以内的数字操作,可是如果两个100亿的数字相加,或者相乘呢?long型肯定不能满足需求。如果是用在天文学的计算,数字更可能达到几十位,甚至是几百位的数字。这已经不可能再使用系统定义的数据类型了,那该怎么解决?主要思想: 不管是大整数相加,还是大整数相乘,都可以把一个数字的各位数字存进一个数组里面,然后再对数组进行操作。就像小学时候的列竖式做加法或者乘法一样。 ...转载 2018-04-17 10:25:21 · 271 阅读 · 0 评论 -
12、计算机如何实现开根号?
如何求一个数字的算术平方根(又叫开根号,或者开方)? 大家普遍都是用计算器直接计算的,对于程序员来说,就是调用sqrt()方法。但是其内部又是怎么实现的呢?方法一:迭代法学过计算方法的应该都还有印象:一个函数 f(x) 在区间 [a,b] 上连续,且 f(x)=0 在 x∈[a,b] 上有解,求x? 最简单的就是用二分法:分别求f(a)、f(b)、f[(a+b)/2],哪两个乘积为...转载 2018-04-17 10:16:44 · 5989 阅读 · 0 评论 -
11、八皇后问题求解
在一个8*8的棋盘上放8个皇后,使得这8个皇后无法互相攻击( 任意2个皇后不能处于同一行,同一列或是对角线上),输出所有可能的摆放情况。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。现代教学中,把八皇后问题当成一个经典递归算法例题。public class Empress { private int n ...原创 2018-04-17 10:04:15 · 436 阅读 · 0 评论 -
10、连续子数组最大和
给定一个数组,求连续的几个子元素构成最大和的子集合:public class findMaxSum { public int FindGreatestSumOfSubArray(int[] array) { if(array == null || (array.length == 1 && array[0] <= 0)) ...原创 2018-04-17 00:55:11 · 184 阅读 · 0 评论 -
9、区间重合判断
区间重合判断 给你一个target线段,判断它是否被已给出的一些线段所包含。 先排序,再将目标区间合并为一个或多个更大的区间,最后判断这些大区间是否可以覆盖源区间。 排序使用快速排序,排序后进行合并,例如比较y0和x1的大小可以判断两个相邻的目标区间是否有交集,如果有交集合并为一个大的区间。 最后再查找,看是否有满足 x <= xi && y <...原创 2018-04-17 00:34:47 · 1308 阅读 · 0 评论 -
8、数组循环移位问题
把一个数组中的元素循环右移k位,时间复杂度严格为O(n),不能是O(kn).利用三次对调,每次对调时间复杂度为 n/2 ,sum(n/2) 刚好为N public class Displacement { public static void removerightk(int a[],int k){ k=k%a.length; ...原创 2018-04-17 00:10:34 · 846 阅读 · 0 评论 -
7、数组分割
有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,使得2个数组之和最小。利用背包思想,包大为 sum(array)/2,然后向包中装物品,使 其中大(不过不确定这种方法的正确性,因为此时规定 装入的东西不得大于 sum/2)但事实是可以大于sum/2 ;1、对数组排序 ,可能这与其他算法不一致的地方,这里是方便计算 NlgN 2、求和 sum S1 N ...原创 2018-04-16 23:46:31 · 271 阅读 · 0 评论 -
6、求数组中最长递增子序列
写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度。 例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长递增子序列为1,2,4,6。import java.util.Arrays;import java.util.Random;public class LISUpdate { public static void main...原创 2018-04-16 23:12:41 · 308 阅读 · 0 评论 -
5、KMP算法
字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 如下面两个字符串:char str = "bacbababadababacambabacaddababacasdsd";char ptr = "ababaca";str有两处包含ptr 分别在str的下标10,26处包含ptr。 算法说明一般匹配字符串时,我们从目标字...原创 2018-04-16 16:24:09 · 184 阅读 · 0 评论 -
3、排序
时间复杂度:程序运行耗费多少时间? 空间复杂度:程序运行耗费了多少内存?整理数据的第一步就是排序,即使已经存在许多标准的排序库,我们仍然需要学习排序算法。基础排序冒泡排序public class BubbleSort { public static void main(String[] args) { int ayy[]= {5,6,7...原创 2018-04-11 13:24:22 · 120 阅读 · 0 评论