
数据结构-编程算法
数据结构
编程算法
FeelTouch Labs
技术架构、人工智能、区块链与密码学专家
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
中兴捧月杯初赛题目--求网络中两点之间的路径--总结篇
中心捧月杯的程序设计部分就这样结束了,在截止时间前我没有提交作品,在此做个总结警醒自己。一,心理认知1,尽管我是心理上认真对待了,这次比赛,但是行动上放松了。但我在初赛中选定一个定目后,感觉根据自己的编程能力3天内基本就可以搞定了,所以前期没有做。2,在截止日期前的三天我全力以赴,果真很见成效,但是毕竟要调试,不懂得地方要去检索,时间很快就过去了3,大数据和性能优化的问题自己没有关原创 2013-07-25 10:57:15 · 3674 阅读 · 0 评论 -
白话经典算法系列之二 直接插入排序的三种实现
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 设数组为a[0…n-1]。1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。3.转载 2013-06-05 00:28:40 · 903 阅读 · 0 评论 -
白话经典算法系列之一 冒泡排序的三种实现
冒泡排序是非常容易理解和实现,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。 按照定义很容易写出代码://冒泡排序1void BubbleSort转载 2013-06-05 00:25:27 · 985 阅读 · 0 评论 -
白话经典算法系列之六 快速排序(Quick sort)
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。 总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快转载 2013-06-05 00:23:08 · 2057 阅读 · 1 评论 -
常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)
转自:http://www.cnblogs.com/kubixuesheng/p/4353616.html冒泡排序算法:总的来说就是两两交换,反复直到有序,第一个记录和第二个记录,若逆序则交换,然后比较第二个和第三个记录,以此类推,直到第 n 个记录和第 n-1个记录比较完毕为止,第一趟排序,结果关键字最大的记录被安排在最后一个位置。对前 n-1个记录继续冒泡排序,使得关键字次转载 2017-12-11 00:11:39 · 972 阅读 · 0 评论 -
一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作
转自:http://www.cnblogs.com/kubixuesheng/p/4084095.html数学中一元n次多项式可表示成如下的形式: Pn(x)=p0+p1x+p2x^2+…+pnx^n (最多有 n+1 项,n +1 个系数唯一确定她) (1)请设计一套接口用以表示和操作一元多项式 (2)根据上述设计实现一元n次多项式的加法转载 2017-12-10 00:05:05 · 1499 阅读 · 0 评论 -
JavaShowAlgorithm-使用2个栈实现队列
思路一:我们设定s1是入栈的,s2是出栈的。入队列,直接压到s1即可出队列,先把s1中的元素倒入到s2中,弹出s2中的栈顶元素;再把s2的剩余元素全部倒回s1中。缺点:每次只要出栈一个元素就要将元素倒来倒去,麻烦!!!思路2:入队列时:如果s1为空,把s2中所有的元素倒出原创 2017-11-19 22:36:30 · 473 阅读 · 0 评论 -
JavaShowAlgorithm-优化的插入排序带着二分查找
二分排序是指利用二分法的思想对插入排序进行改进的一种插入排序算法,不同于二叉排序,可以利用数组的特点快速定位指定索引的元素。算法思想二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在原创 2017-11-19 22:30:37 · 466 阅读 · 0 评论 -
JavaShowAlgorithm-使用2个队列实现栈
队列是先进先出,而栈是先进后出;考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元素,所以我们需要特别处理的是插入操作。由于往栈中添加元素相当于往队列头添加元素,因此我们需要在两个队列中进行元素的转移,比较简单的实现是:1.q1和q2在任一时刻至少有一个为空,即如果有元素,所以元素只在同一个队列中。原创 2017-11-19 19:40:02 · 464 阅读 · 0 评论 -
JavaShowAlgorithm-hanoi的递归和非递归
汉诺塔问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。如果考虑一下把64片金盘,由一根柱子上移到另一根柱子上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方原创 2017-11-19 14:22:07 · 514 阅读 · 0 评论 -
JavaShowAlgorithm-Binary Tree Convert double direction LinkedList
引言 自己觉得对二叉树了解的不是很多,所以想专门练习一下这方面的问题,剑指Offer中有一道题是将二叉搜索树转换为双向链表,开始的时候照着书上的思路去做,最后发现问题很多,看来这本书也有很多问题啊,原因是Java和C++还是有很多不同的,特别是对对象的引用方面。自己在红色部分标注出了问题的所在,希望能给之后遇到同样问题的人一点帮助 分析问题 首先需要明白二叉搜索转载 2017-11-12 15:13:41 · 453 阅读 · 0 评论 -
数据缓存失效算法FIFO、LRU、LFU深入理解
题目:请简要介绍FIFO、LRU、LFU的含义和原理含义:FIFO:First In First Out,先进先出LRU:Least Recently Used,最近最少使用LFU:Least Frequently Used,最不经常使用以上三者都是缓存过期策略。原理和实现:一、FIFO转载 2017-10-24 23:29:40 · 1179 阅读 · 0 评论 -
图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
转自:http://www.cnblogs.com/kubixuesheng/p/4403280.html图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图。设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 B(G)。其中 T(G)是遍历图时所经过的边的集合,B(G) 是遍历图转载 2017-12-10 21:40:09 · 2383 阅读 · 0 评论 -
图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
转自:http://www.cnblogs.com/kubixuesheng/p/4399705.html图的遍历的定义:从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次。(连通图与非连通图)深度优先遍历(DFS);1、访问指定的起始顶点;2、若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之;反之,退回到最近访问过的顶点;直到与起始顶点相通的转载 2017-12-10 21:47:47 · 1779 阅读 · 0 评论 -
图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)
转自:http://www.cnblogs.com/kubixuesheng/p/4399408.html图(Graph)是一种非线性结构图的特点(多对多),顶点之间的关系是任意的,图中任意两个顶点之间都可能相关,顶点的前驱和后继个数无限制。图:数据元素间存在多对多关系的数据结构,加上一组基本操作构成的抽象数据类型。图的基本术语 顶点:图中的数据元素。转载 2017-12-10 21:49:49 · 2689 阅读 · 0 评论 -
二叉树的三种遍历的应用(表达式,求深度,叶子数,结点数,二叉树的建立,复制)
如图所示的二叉树表达式: a+b*(c-d)-e/f若先序遍历此二叉树,按访问结点的先后次序将结点排列起来,其先序序列为: (波兰式,前缀表达式) -+a*b-cd/ef按中序遍历,其中序序列为:a+b*c-d-e/f (中缀表达式)按后序遍历,其后序序列为:abcd-*+ef/- (逆波兰式,后缀表达式)注:人喜欢中缀形式的算术表达式,对于计算机,使用后缀易于求值查询二叉树转载 2017-12-06 00:21:46 · 2302 阅读 · 0 评论 -
[迷思者系列1]每3秒产生一个任意整型
import java.util.Random;import java.util.Timer;import java.util.TimerTask;/** * Created by Administrator on 2018/1/30. * 每3秒产生一个任意整型,即从-2^31次方到2^31次方之间和[0, n)之间的数 */public class GenerateRandom原创 2018-01-30 01:08:10 · 522 阅读 · 0 评论 -
[迷思者系列2]从 0 到 n 之间选 k 个不重复的数组成一个序列
/** * Created by Administrator on 2018/1/30. * 1. 从 0 到 n 之间选 k 个不重复的数组成一个序列 * 2. 全部随机生成生成把1-100000之间些数并保持高效,解决冲突问题 */public class GenerateBigRandom { private static void swap(int[] x, int i原创 2018-01-30 01:48:47 · 559 阅读 · 0 评论 -
一篇文章读懂Reactor和Proactor两种I/O多路复用模式
前言两种I/O多路复用模式:Reactor和Proactor。一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件原创 2018-02-06 01:57:04 · 1649 阅读 · 0 评论 -
JavaShowAlgorithm-全排列算法递归和字典序实现
全排列算法-递归&字典序实现全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 例如: 1 、2 、3三个元素的全排列为:{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。解法1(递归) 如下图:要对1、2、3、4进行排转载 2017-10-29 00:03:06 · 525 阅读 · 0 评论 -
Java面向对象设计的7大原则
原则一:(SRP:Single responsibility principle)单一职责原则又称单一功能原则核心:解耦和增强内聚性(高内聚,低耦合)描述:类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。原则二:开闭原则(OCP:Open Cl原创 2017-10-27 20:22:24 · 666 阅读 · 0 评论 -
JavaShowAlgorithm-二叉树基础
一、概述树结构大部分操作平均运行时间都为O(logN)二、树的定义树是由n(n>=1)个有限节点组成一个具有层次关系的集合。每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。三、树的构造每个节点有一个链指向兄弟,另一个链指向儿子。package com.algorithm.转载 2017-10-27 19:12:56 · 449 阅读 · 0 评论 -
二叉树中和为某一值的路径
路径:从树的根节点到叶子节点经过的节点形成的路径,例如途中(10,5,4),(10,5,7),(10,12)满足和为22的路径有(10,5,7)、(10,12) 参考代码#include #include using namespace std;struct TreeNode { int val; TreeNode *left;转载 2015-02-15 16:43:32 · 668 阅读 · 0 评论 -
笔试面试系列---排序算法专辑---冒泡排序---错误答案纠正
原答案:#include #define LEN 10 //数组长度void main( void ){int ARRAY[10] = { 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 }; //待排序数组printf( "\n" );for( int a = 0; a < LEN; a++ ) //打印数组内容{pri原创 2014-08-26 22:57:21 · 1265 阅读 · 0 评论 -
笔试面试系列---排序算法专辑---直接插入排序---错误答案纠正
面试题 24:编码实现直接插入排序原答案:#includevoid main( void ){int ARRAY[10] = { 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 };int i,j;for( i = 0; i < 10; i++){cout<<ARRAY[i]<<" ";}cout<<endl;for( i = 2; i <= 10; i+原创 2014-08-24 23:37:40 · 1446 阅读 · 0 评论 -
double变量的C++ 输出时的小数点后的位数控制
实例详解一:http://hi.baidu.com/dwj192/item/56ff6c0afefec6f1a110343c实例详解二:http://selllfish.blog.163.com/blog/static/2487436120091010102356388/原创 2013-08-03 21:35:21 · 7231 阅读 · 0 评论 -
virtual copy constructor(虚复制构造函数) 与 Proerty模式
实例详解一:http://grantren.iteye.com/blog/43289实例详解二:http://www.52rd.com/blog/Detail_RD.Blog_imjacob_6244.html实例详解三:http://blizmax2.blog.163.com/blog/static/135418295201041453830860/ (好博客)实例详解四:http原创 2013-08-03 12:06:33 · 1466 阅读 · 0 评论 -
C++中STL容器的find的应用
string类的查找函数: int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置int find(const char *s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置int find(const char *s, int pos, int n) const;//从pos开始查找字原创 2013-08-02 21:05:12 · 2531 阅读 · 0 评论 -
try-catch异常处理
利用try-catch语句可以说明抛出异常的部位,同时又说明捕获、处理的办法。try…catch语句形式如下:try{//此处存放的是编写的函数//例如://int c=fis.read(); // 调用的read()方法抛出异常//说明抛出异常的部位,该部位含有抛出异常的语句,//如调用抛出异常的方法。}catc转载 2013-07-27 16:29:00 · 2434 阅读 · 1 评论 -
中兴捧月杯初赛题目--求网络中两点之间的路径--题目篇
一、标题:求网络中两点之间的路径二、题目在一个网络拓扑中(可以支持数千个点的规模),边是双向的,两点之间最多有一条边,所有边的距离相等(也就是权重为1),给出源和目的两个点,需要找出满足条件的路径。1。找出源和目的之间的一条主用路径。2。找出源和目的之间的一条备用路径。备用路径和主用路径至少有一个点或边不相同。 关于备用路径可能满足下列约束:原创 2013-07-25 09:45:53 · 2661 阅读 · 0 评论 -
母函数(Generating function)经典应用详解
在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和转载 2015-03-30 17:21:42 · 2525 阅读 · 0 评论 -
用C实现文件readLine函数
/ ReadWord.cpp.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#define MAX 64bool readword(FILE *fp,char words[]转载 2015-04-18 21:05:09 · 6448 阅读 · 0 评论 -
JavaShowAlgorithm-找出数组中相同的元素
import java.util.ArrayList; public class Test { private String[] data = { "A", "A", "B", "C", "C", "D", "D", "D" }; // 存储分类好的数据元素。 private Arr转载 2017-10-27 18:59:51 · 591 阅读 · 0 评论 -
JavaShowAlgorithm-二分查找BinarySearch算法
1.二分查找又称折半查找,它是一种效率较高的查找方法。2.二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三转载 2017-10-27 18:49:27 · 518 阅读 · 0 评论 -
Trie树讲解
Trie Trie有一个很有趣的用途,那就是自动提示。而且,前不久在一次面试里,也需要用Trie来解答。所以,在此对这个数据结构进行总结。Trie,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。它有3个基本性质:1.原创 2016-09-28 23:48:38 · 852 阅读 · 0 评论 -
TreeSet与EnumSet
TreeSetTreeSet是SortSet接口的唯一实现,TreeSet可以确保集合元素处于排序状态。与HashSet相比,TreeSet还提供了几个额外的方法:1、Comparator comparator():返回当前set使用的Comparator,或者返回null,表示以自然方式排序。2、Object first():返回集合中的第一个元素。3、Object last原创 2016-09-28 23:44:00 · 697 阅读 · 0 评论 -
概率试题---概率求解问题
马路口,30分钟内看到汽车的概率是95%,那么在10分钟内看不到汽车的概率是?分析:将10分钟看成一个最小的独立事件,那么这个问题就可以转换这样叙述: 进行三次抽样抽到的概率为95%,那么每次抽不到的概率是多少?解:假设每次抽不到的概率都为X,那么 1 - X^3 = 95% => X= 0.37.故这个题的答案就是0.37 桶中有M个白球,小明每分钟从桶中随机取出一个球,转载 2015-04-16 15:32:07 · 1942 阅读 · 0 评论 -
有1,2,…,n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),一次只能交换两个数
#include int main() { int a[] = {10, 6, 9, 5, 2, 8, 4, 7, 1, 3}; int i, tmp; int len = sizeof(a) / sizeof(a[0]); for(i = 0; i < len;) { tmp = a[a[i] - 1]; a[a[i转载 2015-04-20 21:11:58 · 2760 阅读 · 0 评论 -
小量压缩简单算法 .
本方介绍一种简单的数据压缩算法:SB (simple block)作者:realxie在对文档进行倒排的时候经常涉及到对倒排文档的压缩,例如假设有单词instance 出现的文档有<1,3 ,4 , 6 ,9 ,10,... >,即倒排表以升充排列,这样我们就可以在倒排文件中只保存前后两个文档位置的差量,即转变之后结果为<1 ,2 , 1 , 2 , 3 , 1 , ...>,转载 2015-04-16 15:50:22 · 1350 阅读 · 0 评论 -
编程基础---Memoization技术优化递归的重复计算
Memoization 技术是一种将函数返回值缓存起来的方法,Memoization 原理非常简单,就是把函数的每次执行结果都放入一个键值对(数组也可以,视情况而定)中,在接下来的执行中,在键值对中查找是否已经有相应执行过的值,如果有,直接返回该值,没有才 真正执行函数体的求值部分。很明显,找值,尤其是在键值对中找值,比执行函数快多了。Fibonacci(斐波那契)问题Fibonacc原创 2015-04-16 11:40:37 · 6724 阅读 · 0 评论