随笔分类 -  算法学习

合并石子问题 贪心+最大最小堆基本操作
摘要:给定k个序列s1,s2,s3,...,sk,用二路合并方法将k个序列合并为一个。假设将任意两个长度分别为n和m的序列合并为一个需要的代价是m+n-1,设计一个算法来确定合并这些序列的合并为一个的最大代价和最小代价。#include<iostream>using namespace std;void swap(int &a ,int &b){ int temp=a; a=b; b=temp;}//返回数组arr[]的最大值void maxSink(int arr[],int n,int i){ int child; int j=i; while(j<=n/2){ 阅读全文
posted @ 2011-10-20 16:07 geeker 阅读(1498) 评论(1) 推荐(0)
再谈分治
摘要:分治思想的三个步骤:划分问题递归求解合并问题基础例子一求最大连续和,当然这个问题最好的解决方法是DP,不过通过一些简单的例子来展现一种思想,更加清晰一些。找一串数的最大连续和,那么先把这串数分成两个子串:子串a,子串b(习惯从中间分成两半)。那么最大连续和只可能有三种情形,第一种,在子串a中,第二种,在子串b中,第三种,横跨子串a和b。这样的算法在时间复杂度上位nlogn,还算可以。具体代码和详细说明如下: 1 int maxsum(int *A,int x,int y){ 2 int i,m,v,L,R,max; 3 if(y-x==1) return A[x];//就剩一个元素,直接返回 阅读全文
posted @ 2011-07-04 10:28 geeker 阅读(257) 评论(0) 推荐(1)
算法与数据结构(5)——二叉查找树
摘要:由于才疏学浅,平时做题很少建立一棵完整的树。因此觉得二叉查找树又啰嗦又没用,直到今天实验课,让我极度之无语,一个小破题儿差点没整死我... ...于是才决心好好整理一下介个曾经被我藐视过得数据结构... 我打算先从今天的实验课的那道题说起,然后再系统写一棵二叉查找树,也为以后总结各种数的变形打好基础 ~ 实验课的题目是这样的:题目2:给出一个整数序列,请按照顺序建立二叉查找树(BST),然后层次化输出,即先输出根结点,然后是根结点的左孩子、根结点的右孩子,一层一层,从左到右地输出。例:输入顺序为37,24,42,32,7,40,2,42,120。对应的二叉查找树如下所示层次化输出为:37 2. 阅读全文
posted @ 2011-05-17 21:42 geeker 阅读(612) 评论(0) 推荐(2)
数据结构与算法(6)——哈希表
摘要:在很多情况下,我们需要实现一个符号表,里面保存我们用到的所有符号。每个符号有一个关键码key(不同符号的关键码也不同),其余部分可能非常庞大。换句话说,符号表应该提供以下操作:Search(T, k):查找关键码k是否在表中Insert(T, x):把x添加到表中Delete(T, x):从表中删除元素x有时也把符号表称为"字典",它最经典的实现方法是哈希表。哈希表的不同设计方法以及解决冲突的方法,我觉得单单看算法书或者数据结构上的书不是很好理解,但是结合具体的题目实例来看,就相当的具体与好理解,哈希表的思想就类似于我们平时用字典查英语单词,没有一个人会从第一页一页一页的去 阅读全文
posted @ 2011-05-17 21:08 geeker 阅读(2847) 评论(0) 推荐(1)
数据结构与算法(4)——并查集
摘要:并查集 维护一些不相交的集合,它是一个集合的集合。每个元素恰好属于一个集合,好比每条鱼装在一个鱼缸里。每个集合S有一个元素作为\集合代表"rep[S],好比每个鱼缸选出一条"鱼王"。并查集提供三种操作:MakeSet(x):建立一个新集合x。x应该不在现有的任何一个集合中出现。Find(S, x):返回x所在集合的代表元素。Union(x, y):把x所在的集合和y所在的集合合并。森林表示法可以用一棵森林表示并查集,森林里的每棵树表示一个集合,树根就是集合的代表元素。一个集合还可以用很多种树表示,只要树中的结点不变,表示的都是同一个集合。合并操作只需要将一棵树的根 阅读全文
posted @ 2011-05-08 21:13 geeker 阅读(2412) 评论(0) 推荐(2)
数据结构与算法(3)——二叉堆
摘要:#include<iostream>using namespace std;const int HEAP_SIZE = 100;void sink(int fa);void swim(int son);int heap[HEAP_SIZE+1];int hs;//以建立最小堆为例/*****************************************************************///删除堆顶元素 ,利用上游函数调整/*删除最小值(deleteMin) 先用最后一个元素代替根由于这一步会导致根的元素比儿子大,因此需要向下调整。向下调整的方法很简单,就是 阅读全文
posted @ 2011-05-08 17:58 geeker 阅读(1532) 评论(2) 推荐(1)
JAVA零基础——坦克大战(上)
摘要:花了一整天看了马士兵老师讲的坦克大战单机版的视频,作为一名java初学者来说,收获颇多,尤其是感受到面向对象的方法,特此总结一下,以备后用。(最后会附整体代码,及详细注释)说明一下,此小游戏只是熟悉java基础只是而已,谈不上项目...大牛忽视之即可~截止此时已经实现的功能是:画出了一辆坦克,可以八个方向灵活移动,按CTRL建可以发射炮弹 。《第一阶段》做出界面:练习GUI基础知识该阶段代码 1import java.awt.*; 2import java.awt.event.*; 3 4public class TankClient extends Frame { 5 6 public vo 阅读全文
posted @ 2011-04-29 19:38 geeker 阅读(5994) 评论(7) 推荐(5)
记忆化搜索(附例题HDOJ 1501 )
摘要:记忆化搜索又称备忘录方法,是动态规划算法的变形。记忆化搜索编写形式就是直接递归形式,自顶向下,但是加上了标记放置重复搜索、而动态规划是通过打表的形式,自底向上比如过去写的一篇日志《矩阵连乘问题》http://www.cnblogs.com/liushang0419/archive/2011/04/27/2030970.html如果用递归形式实现的话,代码如下:但是仔细思考可以发现,直接用递归实现的话 1 int recurMatrixChain(int i,int j){ 2 if(i==j)return 0; 3 int u = recurMatrixChain(i,i)+recurMatr 阅读全文
posted @ 2011-04-28 13:09 geeker 阅读(2416) 评论(7) 推荐(3)
动态规划——矩阵连乘的问题
摘要:《问题的引出》看下面一个例子,计算三个矩阵连乘{A1,A2,A3};维数分别为10*100 , 100*5 , 5*50按此顺序计算需要的次数((A1*A2)*A3):10X100X5+10X5X50=7500次按此顺序计算需要的次数(A1*(A2*A3)):10X5X50+10X100X50=75000次所以问题是:如何确定运算顺序,可以使计算量达到最小化。枚举显然不可,如果枚举的话,相当于一个“完全加括号问题”,次数为卡特兰数,卡特兰数指数增长,必然不行。《建立递归关系》子问题状态的建模(很关键):令m[i][j]表示第i个矩阵至第j个矩阵这段的最优解。显然如果i=j,则m[i][j]这段 阅读全文
posted @ 2011-04-27 18:10 geeker 阅读(32307) 评论(3) 推荐(3)
POJ 1182 食物链,并查集的拓展
摘要:http://poj.org/problem?id=1182/********************************************************此道题目 前天看的时候一点头绪都没有,看了他人的解题报告后也几乎看不懂,但是首先做了两道并查集的基础题目POJ1611,与POJ2524,熟悉并查集的结构,又做了两道并查集的拓展题目POJ2492与1703,,在充分了解并可以熟悉运用并查集后,此题便可迎刃而解了,也通过此题发现了自学的诀窍“循序渐进”,刚刚AC掉食物链问题,有些小激动,遂发此感慨,呵呵~~~********************************* 阅读全文
posted @ 2011-04-26 22:37 geeker 阅读(699) 评论(0) 推荐(0)
POJ1611__并查集的基础应用
摘要:题目地址:http://poj.org/problem?id=1611/************************************************************************大致题意:一共有n个学生(编号0 至 n-1),m个组,一个学生可以同时加入不同的组。现在有一种传染病,如果一个学生被感染,那么和他同组的学生都会被感染。现在已知0号学生被感染,问一共有多少个人被感染。首先将每个学生都初始化为一个集合,然后将同组的学生合并,设置一个数组num[]来记录每个集合中元素的个数,最后只要输出0号学生所在集合中元素的个数即可。*************** 阅读全文
posted @ 2011-04-26 22:28 geeker 阅读(356) 评论(0) 推荐(1)
数据结构——堆排序
摘要:堆排序总结堆排序思想:最大堆的堆顶元素是全部数据中的最大值,输出这个值。再将剩余元素整理成新的最大堆,此时堆顶元素有时又是剩余元素的最大值,再输出这个值。继续这个过程,每次输出堆顶元素,并将剩余元素整理成新的最大堆再输出...堆排序要解决的几个问题1:如何将数据排列成堆的形式——初始堆的建立2:输出堆顶元素后,剩余元素如何再整理成新的堆——堆的整理3:输出元素放在什么位置预备知识:1: 堆中的元素存储在一个数组中,根据堆中的各元素之间具有有序性关系,可以使用二叉树的方式来表示一个堆。因为各元素从前至后存放在数组的钱n 个单元中,所以所画的二叉树实际上是一颗完全二叉树2: 所以根据完全二叉树的性 阅读全文
posted @ 2011-04-26 18:15 geeker 阅读(4468) 评论(2) 推荐(1)