
Algorithms&&Data Structure
文章平均质量分 65
u013063153
这个作者很懒,什么都没留下…
展开
-
Java最小堆解决TopK问题
原文:http://blog.youkuaiyun.com/xiao__gui/article/details/8687982TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据。TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的关键词。 对于这个问题,解决方法有很多:转载 2017-11-18 20:31:17 · 712 阅读 · 0 评论 -
我的一个朋友过来面试引发我要说的一个小话题
原文地址:http://www.cnblogs.com/huangxincheng/p/4025525.html在很多家公司面试,也包括在携程,大多都会被问到一些算法的问题,其中机票事业部的面试,基本上算是算法问题的重灾区,没办法,有几个领导喜欢用数据结构来考人家,其中包括一些常见数据结构的复杂度以及手写一些算法,比如快排,单链表等等,前几天我一个推荐过来的朋友膝盖就被中了一箭转载 2016-09-18 09:24:26 · 403 阅读 · 0 评论 -
已知随机数函数rand7(),如何构造rand10()函数
//生成随机数7;int rand7(){ return rand()%7 + 1;}//生成随机数10;int rand10(){int x = 0;do{x=(rand7()-1)*7 + rand7();//生成1——49之间的数}while(x>40);return x%10 + 1;}原创 2015-07-26 17:33:37 · 1280 阅读 · 0 评论 -
什么是霍夫曼编解码?
编码分为:等长编码和非等长编码。ACSII和UNICODE是等长编码。等长编码存在局限,就是浪费空间。霍夫曼编码是一种非等长编码。霍夫曼编码的过程就是构造霍夫曼树的过程,其相应的算法如下:(1)有一组需要编码且带有权值的字母,如a(4),b(8),c(1),d(2),e(11)。括号中的数字分别是对应的字母的权值。(2)选取字母中权值较小的两个c(1),d(2)组成一个新二叉树原创 2015-07-26 19:32:05 · 1454 阅读 · 0 评论 -
什么是拓扑排序
如果将某一集合中的所有元素作为图的结点,将该集合上的偏序关系作为图的边,则任意一个偏序关系即可以表示一个有向图。 拓扑排序是有向图的一个重要操作。在给定的有向图G中,若顶点序列v1,v2,..,vn满足下列条件:若在有向图G中从顶点vi到顶点vj有一条路径,则在序列中顶点vi必在vj之前,便称这个序列为一个拓扑序列。求一个有向图拓扑序列的过程称为拓扑排序。 常用的拓原创 2015-07-26 20:21:57 · 6231 阅读 · 2 评论 -
排序算法分类和算法时间复杂度比较
排序算法分类:插入排序(直接插入排序、希尔排序);选择排序(直接选择排序、堆排序);交换排序(冒泡排序、快速排序);归并排序;分配排序;排序算法时间复杂度直接插入排序O(n^2)直接选择排序O(n^2)堆排序O(nlogn)原创 2015-08-07 14:12:51 · 593 阅读 · 0 评论 -
直接插入排序算法
//直接插入排序void insert_sort(int a[], int n){ int i, j, temp; for(i = 1; i < n; i++) { //暂存下标为i的数。下标从1开始,因为开始时下标为0的数,前面没有任何数,此时认为它是排好顺序的 temp=a[i]原创 2015-08-07 14:23:50 · 489 阅读 · 0 评论 -
希尔排序算法
void shell_sort(int a[], int len){ int h, i, j, temp; for(h = len/2; h > 0; h = h/2) { for(i = h; i < len; i++) { temp = a[i];原创 2015-08-07 14:31:59 · 334 阅读 · 0 评论 -
冒泡排序算法
void bubble_sort_1(int a[], int len){ int i = 0; int j = 0; int temp = 0; for(i = 0; i < len - 1; i++) { for(j = len - 1; j >=i; j--)原创 2015-08-07 14:42:00 · 301 阅读 · 0 评论 -
快速排序算法
void quick_sort(int a[], int low, int high){ int i, j, pivot; if(low < high) { pivot = a[low]; i = low; j = high; while(i原创 2015-08-07 14:56:10 · 355 阅读 · 0 评论 -
选择排序算法
void select_sort(int a[], int len){ int i, j, x, l; for(i = 0; i < len; i++) { x = a[i]; l = i; for(j = i; j < len; j++) {原创 2015-08-07 15:06:38 · 336 阅读 · 0 评论 -
外排序
方法介绍所谓外排序,顾名思义,即是在内存外面的排序,因为当要处理的数据量很大,而不能一次装入内存时,此时只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是一种“排序-归并”的策略。在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件;尔后在归并阶段将这些临时文件组合为一个大的有序文件,也即排序转载 2017-02-08 12:46:04 · 413 阅读 · 0 评论 -
连续子数组的最大和
题目:输入一个整型数组,数组里有整数也有负数。数据中一个或连续的多个整数组成子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。原创 2017-01-20 10:57:22 · 454 阅读 · 0 评论 -
从1到n整数中1出现的次数
题目:原创 2017-01-20 14:21:31 · 440 阅读 · 0 评论 -
八大排序算法总结与Java实现
原文:https://itimetraveler.github.io/2017/07/18/%E5%85%AB%E5%A4%A7%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93%E4%B8%8Ejava%E5%AE%9E%E7%8E%B0/概述因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。转载 2017-11-03 01:33:49 · 3311 阅读 · 1 评论 -
数据结构与算法系列 目录
原文:http://www.cnblogs.com/skywang12345/p/3603935.html数据结构和算法目录表 CC++Java线性结构1. 数组、单链表和双链表2. Linux内核中双向链表的经典实现 数组、单链表和双链表 数组、单链表和双链表 栈 栈 栈转载 2017-06-14 15:54:14 · 1148 阅读 · 0 评论 -
Java去除一个Map中value值最小的K个记录
import java.util.*;public class TestHeapSorted { public static void main(String[] args) { Map testMap = new HashMap(); testMap.put("tag2", "2"); testMap.put("tag1", "1");原创 2017-06-16 17:10:42 · 1611 阅读 · 0 评论 -
求N个数中最小的K的数 O(NlogK)
import java.util.ArrayList;public class HeapSorted { public static void main(String[] rags) { HeapSorted testSorted = new HeapSorted(); int[] input = {2,2,7,4,8,2,9,3,6,5};原创 2017-06-16 13:15:18 · 1004 阅读 · 0 评论 -
海量数据解决思路之BitMap
原文:http://zengzhaozheng.blog.51cto.com/8219051/1404108一、概述 本文将讲述Bit-Map算法的相关原理,Bit-Map算法的一些利用场景,例如BitMap解决海量数据寻找重复、判断个别元素是否在海量数据当中等问题.最后说说BitMap的特点已经在各个场景的使用性。二、Bit-Map算法先看看这样的一转载 2017-04-26 14:43:20 · 9547 阅读 · 3 评论 -
平衡查找树之B树
原文:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html前面讲解了平衡查找树中的2-3树以及其实现红黑树。2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key。维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其转载 2017-05-12 23:24:12 · 514 阅读 · 0 评论 -
常见数据结构(二)-树(二叉树,红黑树,B树)
原文链接:http://brianway.github.io/2016/10/14/algorithms-data-structures-2/写在前面本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides相关命题的证明可参考《算法(第4版)》源码可在官网下载,也可以在我的github仓库 algorithms-learn转载 2017-01-22 11:21:46 · 560 阅读 · 0 评论 -
常见数据结构(一)-栈,队列,堆,哈希表
写在前面本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides相关命题的证明可参考《算法(第4版)》源码可在官网下载,也可以在我的github仓库 algorithms-learning下载,已经使用maven构建仓库下载:git clone git@github.com:brianway/algorithms-learning转载 2017-01-22 11:19:10 · 643 阅读 · 0 评论 -
Hash表、Hash函数及冲突解决
1.Hash表 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构。也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中。转载 2017-01-22 11:15:20 · 818 阅读 · 0 评论 -
数据结构和算法学习笔记——图论
图一个图 G=(V,E) 由顶点集 V 和边集 E 组成。每条边是一个点对 (v,w) ,其中 v,w∈V 。如果点对是有序的,则图称为有向图。顶点 v 和 w 邻接当且仅当 (v,w)∈E 。有时边还有权或值属性。图中的路径是一个顶点序列 w1,w2,...,wN ,满足 (wi,wi+1)∈E , 1≤iN 。路径的长为该路径的边数 N−1 。顶点到自身可以看作有不包含边的路径,路径长转载 2017-01-22 11:10:21 · 1988 阅读 · 0 评论 -
堆排序算法
小根堆:所有子节点都大于其父节点。大根堆:所有子节点都小于其父节点。int heapSize = 0;//返回左子节点索引int Left(int index){return ((index << 1) + 1);}//返回右子节点索引int Right(int index){return ((index << 1)+ 2;)} //交换a,b的值voi原创 2015-08-07 15:55:35 · 334 阅读 · 0 评论 -
归并排序算法
使用数组结构,自顶向下算法。//将分治的两端按大小次序填入临时数组,最后把临时数组拷贝到原始数组中//lPos到rPos-1为一端,rPos到rEnd为另一端void Merge(int a[], int tmp[], int lPos, int rPos, int rEnd){ int i, lEnd, NumElements, tmpPos; lEnd = rPos;原创 2015-08-07 16:26:01 · 326 阅读 · 0 评论 -
基数排序算法
基数排序算法是箱排序(桶排序)的改进和推广。int find_max(int a[], int len) //查找长度为len的数组的最大元素{ int max = a[0]; for(int i = 1; i < len; i++) { if(max < a[i]) max = a原创 2015-08-07 16:56:16 · 344 阅读 · 0 评论 -
十进制与十六进制、二进制、八进制之间的转换(Java)
十进制与十六进制、二进制、八进制之间的转换package cn.itheima;public class ToHexBinOctDemo { /**移位法实现8进制,二进制,十进制转换 * @param args */ public static void main(String[] args) { int num=13; //用Java内置函数与自定义函数输出结果进原创 2015-09-06 13:14:40 · 605 阅读 · 0 评论 -
Java字符串反转
最常用的方式是,反向取出每个字符,然后打印:public class StringReverse { public static void main(String[] args) { // 原始字符串 String s = "A quick brown fox jumps over the lazy dog."; System.out.println("原始的字符原创 2015-09-09 12:25:44 · 713 阅读 · 0 评论 -
格雷码Java
n为元格雷码是由n-1为格雷码实现的:public String[] GrayCode(int n) { // produce 2^n grade codes String[] graycode = new String[(int) Math.pow(2, n)]; if (n == 1) { graycode[0] = "0"; graycode原创 2015-09-09 12:32:51 · 603 阅读 · 0 评论 -
面试中关于字符串的一些问题
1、google笔试:编码实现求给定字符串(全为小写英文字母)的最小后继,如"abc"的最小后继为"abd","dhz"的最小后继为"di"。思路:题目比较简单,对最后一个字符+1,如果大于'z'则对前一个字符+1,如果又是大于 'z' 则重复之前步骤。所以写代码时,我们只要对字符串循环从后往前对每一个字符进行+1,直到出现+1后不超过'z'为止。如果退出循环时第一个字符大于于'z'则提示不存原创 2015-10-21 10:18:01 · 496 阅读 · 0 评论 -
字符串逆序
普通逆序基本上没有这么考的,放在这里主要是为了和后面的原地逆序做个对比。很简单,直接分配一个与原字符串等长的字符数组,然后反向拷贝一下即可。char* Reverse(char* s){ //将q指向字符串最后一个字符 char* q = s ; while( *q++ ) ; q -= 2 ; //分配空间,存储逆序后的字符串。原创 2015-10-21 10:20:17 · 870 阅读 · 0 评论 -
Java数据结构面试题
栈和队列的共同特点是(只允许在端点处插入和删除元素)4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构)5.下列关于栈的叙述正确的是(D) A.栈是非线性结构B.栈是一种树状结构C.栈具有先进先出的特征D.栈有后进先出的特征6.链表不具有的特点是(B)A.不必事先估计存储空间 B.可随机访问任一元素C.插入删除不需要移动元素 D.所需空间与线性表长度原创 2015-11-01 23:15:52 · 1035 阅读 · 1 评论 -
Java动态规划 实现最长公共子序列以及最长公共子字符串
动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字转载 2015-11-02 22:38:17 · 576 阅读 · 0 评论 -
Java动态规划 实现最长公共子序列以及最长公共子字符串
动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字转载 2015-11-02 22:38:58 · 5344 阅读 · 0 评论 -
程序员面试100题之七:最长公共子字符串
子字符串的定义和子序列的定义类似,但要求是连续分布在其他字符串中。比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2。 最长公共子字符串共有两种解决方法,下面具体说说我的思路方法一: Longest Common Substring和Longest Common Subsequence是有区别的 X =转载 2015-11-02 22:39:24 · 556 阅读 · 0 评论 -
任意进制整数之间的相互转换(C++实现)
任意进制整数之间的相互转换经常出现在各大IT公司的笔试面试中,这里我对其中的算法和实现代码做个总结。 算法思想:例如,要求将x1进制的数r1转化成为x2进制的数r2,首先应该将r1转化为十进制的数r_decimal,然后再将十进制数r_decimal转化为x2进制的数r2。(1下面是我用C++实现的代码,已经在visual C++ 6.0上测试通过了,程序没有考虑太多的细节(整数和转载 2015-11-02 22:40:53 · 3520 阅读 · 2 评论 -
哈夫曼树例子
五个字符:a,b,c,d,e,它们出现的的频率为8,14,10,4,18构造相应的哈夫曼树,求出每个字符的哈夫曼编码:哈夫曼树: 54 / \ 22 32 / \ / \c10 12 b14 e18 / \ d4原创 2015-09-03 20:38:10 · 3438 阅读 · 0 评论 -
各种排序算法思想及其稳定性总结
(1)冒泡排序 冒泡排序比较的是相邻的两个元素比较,交换也发生在这两个元素之间。冒泡排序是稳定的。(2)选择排序 选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出原创 2015-08-27 13:51:31 · 494 阅读 · 0 评论 -
快速排序算法Java
快速排序算法是一种不稳定排序算法。快速排序算法Java代码:package testSortAlgorithm; public class QuickSort { public static void main(String[] args) { int [] array = {49,38,65,97,76,13,27}; quickSort(array,原创 2015-08-27 13:42:26 · 465 阅读 · 0 评论