
算法
文章平均质量分 78
yilip
追求优秀,成功就追随你........
展开
-
辗转相除法简单证明
设两数为a、b(b<a), 求证gcd(b,a)=gcd(a%b,b) 求它们最大公约数的步骤如下:用b除a,得a=bq+r(0≤r<b)(q是这个除法的商)。若r=0,则b是a和b的最大公约数。若r≠0,则继续考虑。 首先,应该明白的一点是任何 a 和 b 的公约数都是 r 的公约数。要想证明这一点,就要考虑把 r 写成 r=a-bq。现在,如果 a 和 b 有一个原创 2012-06-09 11:52:14 · 827 阅读 · 0 评论 -
数据结构之哈夫曼树(java实现)-(五)
所谓哈夫曼树就是要求最小加权路径长度,这是什么意思呢?简而言之,就是要所有的节点对应的路径长度(高度-1)乘以该节点的权值,然后保证这些结果之和最小。 哈夫曼树最常用的应用就是解决编码问题。一般我们用的ASCII是固定长度的编码,对于那些常用的字符,使用很长的长度就显得略为浪费空间了。 下面以一个实例来构建一颗哈夫曼编码树。 设字符集S={A,B,C,D,E,F},字符出现的原创 2015-04-13 22:24:45 · 1824 阅读 · 0 评论 -
读写者问题-java实现
读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:(1)允许多个读者同时执行读操作;(2)不允许读者、写者同时操作;(3)不允许多个写者同时操作。原创 2014-12-17 20:39:56 · 7307 阅读 · 5 评论 -
360笔试-关于手表指针
关于手表指针的算法思考 我们都知道手表上又时分秒三个指针,时针可以决定分针和秒针的位置,分针可以决定秒针的位置。为了简单起见,现在假设只有时针和分针。 现假设某一刻为H:M,(H=0,1,2…11;M=0,1,2..59),那么在该时刻分针的角度(距离起点0点)为:,时针的角度:,那么时针和分针的夹角:问题1.时针和分针重合的时刻? 令,化简之后得:由此可原创 2015-04-26 20:20:58 · 1063 阅读 · 0 评论 -
360笔试题目-HashMap实现
自定义一个HashMap,实现map_put,map_delete,map_get方法,要求: 1.查找时间复杂度O(1) 2.. 3.. 因为Java中自带HashMap,平时直接用,也没有考虑,前一段时间只是实现了ArrayList,Vetor,Quene,并没有考虑HashMap。笔试的时候由于时间紧,我只是在HashMap中定义两个ArrayLi原创 2015-04-25 17:48:14 · 1801 阅读 · 1 评论 -
360笔试题目
记得本科的时候算法课上看到过这个题目,当时没有做出来,今天做360笔试的时候竟然仍然没做出来,真蛋疼。回来研究了半天,我擦,两个小时做那么多题目,这个肯定做不出来。 题目: 大意是:给定一个字符串S:“BLFBFSYDLEAKLFBYM”,和一个关键字T:“LBY”,求出在S中包含T的最小字符串?那么应该求出最小字符串:“LFBY” 思路一:遍历T,再遍历S。(咋一看是这样,但是操作起来比较麻烦,我也没实现) 思路二:分别求出关键字T中第一个字符和最后一个字符原创 2015-04-25 03:02:03 · 2652 阅读 · 6 评论 -
数据结构之贪心算法(背包问题的思考)-(十)
*贪心算法:装箱问题的思考 * @author Lip *装箱问题可以是时间调问题的延伸,当一个箱子没有容积限制,那么就是时间调度问题 *在时间调度问题中:存在两个可以讨论的问题。1.平均最短时间 2.总的最短时间 *这两个问题都和装箱问题中问题如此类似。 *//* * 上面是我理解的装箱问题,本来是想说背包问题的 * 背包问题的描述:有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。 * 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大原创 2015-05-09 01:39:10 · 3161 阅读 · 1 评论 -
数据结构之分治法(最短距离)-(十一)
* 分治法,所谓分治当然是分而治之,化整为零。 * 分治法分为两部分,1.分(Divide)2.治(Conquer) * 在排序算法中我们用到的二分排序就是分治法最经典的一个例子 * 传统的分治法要运行两次及其以上的递归算法,一般用分治法解决问题的时间复杂度是O(N*lgN)原创 2015-05-11 19:37:37 · 2954 阅读 · 0 评论 -
程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结
程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结(七月算法在线学院:http://www.julyedu.com/,面试&算法&机器学习在线课程)作者:July--结构之法算法之道blog之博主。时间:2010年10月-2014年12月。出处:http://blog.youkuaiyun.com/v_JULY_v 。声明:版权所转载 2015-05-12 17:49:13 · 1682 阅读 · 1 评论 -
数据结构之关于树的操作(树的递归和非递归遍历)-(四补)
前面写了一些关于树的操作,但是没有实现树的遍历的非递归写法。 通常树有四种遍历方法:1.层次遍历(需要用到树的高度,此文没有考虑) 2.前序遍历(根左右);3.中序遍历(左根右);4.后序遍历(左右根) 树的结构如下: 层次遍历:123456789 前序遍历:124895367 中序遍原创 2015-05-13 02:35:02 · 3773 阅读 · 0 评论 -
数据结构之排序算法(八大排序)-(八)
排序算法可以分为稳定排序和不稳定排序。在简单形式化一下,如果A[i] = A[j],A[i]原来在位置前,排序后A[i]还是要在A[j]位置前,这才能叫稳定排序。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。另外,如果排序算法稳定,对基于比较原创 2015-05-06 10:16:00 · 2414 阅读 · 3 评论 -
数据结构之单源最短路径(迪杰斯特拉算法)-(九)
最开始接触最短路径是在数据结构中图的那个章节中。运用到实际中就是我在大三参加的一次美赛中,解决中国的水资源问题。所谓单源最短路径,就是一个起点到图中其他节点的最短路径,这是一个贪心算法。 迪杰斯特拉算法原理(百科):按路径长度递增次序产生算法:把顶点集合V分成两组:(1)S:已求出的顶点的集合(初始时只含有源点V0)(2)V-S=T:尚未确定的顶点集合原创 2015-05-06 21:48:31 · 3003 阅读 · 1 评论 -
已知二叉树的前序和中序遍历,构建该二叉树
先说说原理吧:前序遍历的第一个节点必然是树的根节点通过第1个节点将中序遍历分割为两部分,左边的就是树的左子树的节点,右边就是树的右子树的节点重复1,2步,直至构建一颗完整的二叉树 Java代码: // 前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6} public TreeNode reConstructBinaryTr原创 2015-09-04 22:51:09 · 1577 阅读 · 0 评论 -
数据结构之二叉堆(构建堆,堆排序)-(七)
/* * 堆的性质(最小堆为例): * 0.根节点为最小值 * 1.堆可以看做是一个完全二叉树(即孩子节点从左向右排列) * 2.堆的高度lgn/lg2(n为节点的数目) * 3.第i节点的左孩子节点是2*i+1,右孩子节点为2*i+2 * 4.以任意一个节点作为根节点,那么该节点都是堆 * 5.可以用一个数据来表示堆 */ /* * 构建堆的原理: * 上滤 * 在最后一个节点后建立一个空节点原创 2015-04-23 21:16:10 · 3042 阅读 · 0 评论 -
数据结构之二叉查找树(BST)-(六)
二叉查找树在数据结构中也经常会被用到。所谓二叉查找树就是从根节点开始,左边的节点比右边的节点小。显然BST的前序遍历就是一个从小到大的有序数组。 JAVA构建二叉查找树: // 构建一颗二叉查找树 /*原理: * 下一个数据和根节点比较,比根大放在根的右边,然后再跟节点的右孩子节点比较 * 比根节点小,则放在根节点的左侧, * 如果等于根,那么不操作原创 2015-04-22 16:49:47 · 1195 阅读 · 0 评论 -
数据结构之计算器的实现(JAVA)(四)
原理: 1.将中序表达式变化后续表达式 2.当前字符为数字,将该数字放入栈中 3.当前字符为操作符,从栈中取出两个树,根据操作符来运算,将运算结果放入到栈中 4.重复,直到将字符操作完,此时栈中只剩下一个元素,即要运算的结果 PS:我没有处理,只可以运行10以内的运算,如果有需要可以扩展 package com.原创 2015-04-01 18:29:42 · 2252 阅读 · 0 评论 -
分治法中的排序问题
分治法求解排序问题的思想很简单,只需按某种方式将序列分为两个或多个子序列,分别进行排序,再将已经排好序的子序列合并成一个有序序列即可。合并排序和快速排序是两种典型的符合分治策略的排序算法。 合并排序 合并排序的基本运算时把两个或者多个有序序列合并成一个有序序列。下面以两路合并排序为例说明。 注:以C++为例。其中l为模板类SortList原创 2012-06-09 12:33:28 · 962 阅读 · 0 评论 -
非常好的理解遗传算法的例子
遗传算法的手工模拟计算示例为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各 个主要执行步骤。 例:求下述二元函数的最大值: (1) 个体编码 遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种 符号串。本题中,用无符号二进制整数来表示。转载 2013-01-22 10:20:05 · 1156 阅读 · 0 评论 -
逆时针打印矩阵
金山的笔试题目:给一个矩阵,将矩阵逆时针打印出来原创 2014-11-27 13:53:32 · 3590 阅读 · 2 评论 -
海豚实习-实现两个大数相乘
问题描述:定义大数d为一个数组,表示为:d=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0](k为数组长度),实现一个函数,返回两个大数相乘的结果 /** d1=a[k-1]*10^(k-1)+a[k-2]*10^(k-2)+...+a[1]*10+a[0] d2=b[l-1]*10^(l-1)+b[l-2]*10^原创 2014-12-07 10:19:48 · 1271 阅读 · 0 评论 -
編程之美﹣電梯調度算法
最近想详细研究一下电梯调度算法,但是所涉及到内容太多了,目前没有时间了。关于电梯算法的种类: http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html 那我只能研究一下简单的了。 这是编程之美中的一道题目: 一座大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯在每层都停原创 2015-03-20 22:49:54 · 1560 阅读 · 0 评论 -
阿里电话面试-解决两个冲突的事项
情形:甲和乙有些代办事项,每一个事项都有一个开始时间,和一个截止时间。但是甲和乙的代办事项可能会出现冲突,若在一个代码事项中,存在其他代办事项,则就认为是冲突。现要求合并甲和乙的代码事项,不能够有冲突。 解决: 由于我经常用java,所以就用java模拟该问题。 定义代办事项: public class Node{ private int startTime;原创 2015-03-22 01:59:51 · 2271 阅读 · 4 评论 -
数据结构之栈的实现(JAVA)(一)
//栈顶元素public class StackElement{ private StackElementnextElement; private T data; public StackElement(T data) { this.data=data; } public StackElement getNextElement() { return nextE原创 2015-03-31 00:25:28 · 1440 阅读 · 0 评论 -
数据结构之队列的实现(JAVA)
StackElement请看栈的实现 package com.lip.datastruture.stack;public class Queue{ private StackElement obj;//保存数据 private int size;// 元素个数 public Queue() { this.size = 0; } // 入队列 public原创 2015-03-31 00:30:24 · 1015 阅读 · 0 评论 -
数据结构之中序遍历转后续遍历(JAVA实现)(二)
算法流程: 主要分为四步: 1.当前字符为数字或者字母,则直接输出 2.当前字符为),则在栈中匹配输出,一直匹配到),则停止输出(就是将)及其顶上的元素全部弹出来输出) 3.当前字符为操作符,则比较当前字符的入栈优先级(icp)和字符栈内优先级(isp),如果icp 4.当前字符为空,则将栈中元素依次弹出输出 百度原创 2015-03-31 11:24:28 · 2069 阅读 · 0 评论 -
Java 中使用队列
在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。 Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。转载 2015-04-01 16:45:00 · 756 阅读 · 0 评论 -
数据结构之关于树的操作(JAVA实现)(三)
树的基本结构 public class TreeNode { public TreeNode leftNode; public TreeNode rightNode; public T data; public TreeNode(T data) { this.data = data; } } 1.构建一颗树(本文以表达式树为例,原创 2015-04-01 17:45:36 · 4604 阅读 · 1 评论 -
摇号中签生成随机号
在现在很多类似于股票市场的交易中,很多项目发行都需要进行申购,等到申购结束,进行摇号,根据中签尾号确定每个用户的中签数量。如果用户U1购买了10个产品,那么他申购的产品尾号就是10000001到10000010,用户U2再购买5个,那么U2的产品尾号10000011到10000015。现在假如发行项目A,发行量为12345,申购量为675893。随机生成中签尾号:package com原创 2016-05-05 14:10:22 · 5843 阅读 · 1 评论