
算法
文章平均质量分 71
zsuguangh
这个作者很懒,什么都没留下…
展开
-
动态查找树比较
<br />转自http://www.javaeye.com/topic/614070<br />1. 二叉查找树 (Binary Search Tree) 详细见《查找结构专题(2):二叉查找树 [BST] 》<br /> <br /> 很显然,二叉查找树的发现完全是因为静态查找结构在动态插入,删除结点所表现出来的无能为力(需要付出极大的代价)。<br /> <br /> BST的操作代价分析:<br /> (1) 查找代价: 任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶转载 2011-01-22 15:31:00 · 942 阅读 · 0 评论 -
外排序思路总结
<br />外排序的过程基本上分为:<br />1)文件分成若干尽可能长的初始顺串<br />2)逐步归并顺串,最后形成一个已排序的文件<br /> <br />对第一步,可以使用置换选择排序算法生成若干个顺串<br />对第二步,可以使用二路外排序或者多路归并(选择树--赢者树&败者树--关于赢者树&败者树请看博客的前一篇文章)原创 2011-03-27 14:48:00 · 1125 阅读 · 0 评论 -
解决分配问题的匈牙利算法
<br />匈牙利方法是为解决所谓“分配问题”,“指派问题”等数学问题的方法。这类问题的一般性叙述为: <br /> 有n个问题要分配给n个人去完成。第i个人完成第j项任务的成本为Cij。问:如何分配任务,能使总成本最小? 应用举例<br /> 引入变量Xij,Xij的取值表示: <br /> Xij=1,指派第个人去完成第j项任务; <br /> Xij=0,不指派第个人去完成第j项任务。 <br /> 假如五个人完成五项任务,“成本矩阵”为: <br /> 12 7转载 2011-04-03 14:59:00 · 8973 阅读 · 0 评论 -
编程之美2.14扩展问题1 求子数组和的最大值(首尾可以相连)
<br />整体思路:<br />问题的解可以分为两种情况:<br />1)解没有跨过A[n-1]到A[0],即普通的求子数组和的最大值<br />2)解跨过A[n-1]到A[0]<br />对第二种情况,只要找到从A[0]开始和最大的一段(A[0],...,A[j])(0<=j<n)以及A[n-1]结尾的和最大的一段(A[i],...,A[n-1])(0<=i<n),那么第2种情况中,和的最大值M_2为:<br />M_2=A[i]+...A[n-1]+A[0]+...+A[j]<br />如果i<=j,原创 2011-04-21 11:15:00 · 2732 阅读 · 4 评论 -
编程之美2.14 求数组的子数组之和的最大值
<br />问题描述:<br />一个有N个整数元素的一维数组(A[0],A[1],...A(n-1),它包含很多子数组,求子数组之和的最大值,当数组元素全部为负的时候,有两种处理办法,第一种是返回0,第二种是返回数组中最大的负数。<br />解法1:<br />使用暴力法,假设最大的一段数组为A[i],...,A[j],则对i:=0~n-1 j:=i~n-1,遍历一遍,求出最大的Sum(i,j)即可<br />解法2:<br />使用分治法,数组(A[0],A[1],...A(n-1)分为长度相等的两段数原创 2011-04-20 20:05:00 · 2731 阅读 · 2 评论 -
编程之美2.5 寻找最大的K个数
/********************问题描述************************有若干个无序的数(假设数目为N),如何选择其中最大的K个数*****************************************************/#include#include#includeusing namespace std;/***********************解法一:全部排序**************将输入的N的数排序,然后选出原创 2011-04-21 21:41:00 · 2493 阅读 · 2 评论 -
编程之美2.17 数组循环移位
<br />问题描述<br />把一个含有N个元素的数组循环右移K位,如K=4的时候abcd1234->1234abcd。一般考虑K>0的情况,即右移;同时K<N,当然K>=N的话可以通过K%=N得到一样的结果<br /> <br />解法思路详见代码注释<br />/****************************问题描述*****************************把一个含有N个元素的数组循环右移K位,如K=4的时候abcd1234->1234abcd一般考虑K>0的情况,即原创 2011-04-22 00:22:00 · 1375 阅读 · 0 评论 -
编程之美2.14扩展问题2 求数组的子数组之和的最大值并给出子数组的起始终止位置
<br />求子数组之和的最大值采用之前的博客编程之美2.14 求数组的子数组之和的最大值中的动态规划方法,时间复杂度为O(N),在求nAll的过程中,记录子数组和最大值的那个数组的起始位置start跟终止位置end,下面的源码也分成了两种情况处理,一种情况是数组元素全为负的时候返回最大的负数,数组中除了0就是负数的情况则返回最后一次出现的那个0所在的位置(对应于程序的define RETURN_MAXMINUS块);另外一种情况是数组元素全为负数的时候返回0并置start跟end为-1,数组中除了0就是负原创 2011-04-21 00:21:00 · 2834 阅读 · 0 评论 -
编程之美3.9 重建二叉树
<br />问题描述:给定一个前序遍历和一个中序遍历,重建一棵二叉树。如:<br />前序:a b d c e f<br />中序:d b a e c f<br />a是根节点。<br />思路:根据前序,可以很快找出根节点a,然后根据中序,可以找出根节点a的左右子树,然后递归求a的左子树前序b d跟中序d b,a的右子树前序c e f跟中序e c f即可<br />#include<iostream>using namespace std;//定义树的长度#define TREELEN 6转载 2011-04-28 00:59:00 · 1690 阅读 · 0 评论 -
编程之美3.8 求二叉树中节点的最大距离
<br />转自:http://www.cnblogs.com/miloyip/archive/2010/02/25/1673114.html问题定义<br />如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。<br />书上的解法<br />书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述。<br />计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到转载 2011-04-27 21:22:00 · 1285 阅读 · 0 评论 -
编程之美 2.1 求一个数的二进制表示中1的个数
<br />/**************问题描述************求二进制数中1的个数**********************************/#include<iostream>using namespace std;/****************解法一:直接除2*******************对num除以2,余数为1则result加1,时间复杂度为O(logv)v为num的二进制位数**************************原创 2011-04-30 02:02:00 · 1342 阅读 · 0 评论 -
赢者树与败者树
<br />转自:http://hi.baidu.com/flower_mlh/blog/item/ca338ecbf07666067e3e6f9a.html<br />胜者树与败者树是完全二叉树。就像是参加比赛一样,每个选手有不同的实力,两个选手PK,实力决定胜负,晋级下一轮,经过几轮之后,就能得到冠军。胜者树和败者树也是, <br /> <br />每个叶子节点相当于一个选手,每个中间节点相当于一场比赛,每一层相当于一轮比赛。不同的是,胜者树的中间节点记录的是胜者的标号,但是败者树的中间节点记录的是败者转载 2011-03-27 14:37:00 · 5083 阅读 · 2 评论 -
BloomFilter——大规模数据处理利器
<br />转自:http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html<br />Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。<br /> <br />一. 实例 <br /> 为了说明Bloom Filter存在的重要意义,举一个实例:<br /> 假设要你写一个网络蜘蛛(web crawler)。由于网络转载 2011-03-27 11:07:00 · 699 阅读 · 0 评论 -
中序表达式转后序表达式
<br />例如:中序表达式(23+34*45/(5+6+7))转换成后序表达式23 34 45 * 5 6 + 7 + / +<br />后序表达式用处:<br />当转换成后序表达式后更方便计算表达式的值,如将后序表达式的元素依次进栈直到遇到运算符,这时候从栈中弹出两个元素,再结合运算符计算出这两个数运算的结果(如34*45=1530),将其结果压栈(此时栈元素为23 1530),然后继续将后序非符号元素压栈,直到遇到运算符。重复之前的操作。。。<br />InfixExp(中序表达式)转换Postfi原创 2011-03-27 00:35:00 · 18988 阅读 · 0 评论 -
STL algorithm库
<br />Standard Template Library: Algorithms <br />The header <algorithm> defines a collection of functions especially designed to be used on ranges of elements.<br />A range is any sequence of objects that can be accessed through iterators or pointers, suc转载 2011-02-28 22:02:00 · 1540 阅读 · 0 评论 -
string大小写转换函数
<br />转自:http://blog.youkuaiyun.com/xiayang05/archive/2010/09/25/5905299.aspx<br />C++中没有string直接转换大小写的函数,需要自己实现。一般来讲,可以用stl的algorithm实现:<br />#include <iostream><br />#include <cctype><br />#include <string><br />#include <algorithm><br />using namespace std;<b转载 2011-02-28 21:38:00 · 1003 阅读 · 0 评论 -
求集合的幂集
// Virtual.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include using namespace std; /* 求幂积最简单的算法思想就是从最后一个元素倒着来遍历所有元素,比如说最后一个就是自己"c" ; 倒数第二个:首先把自己和幂积里面已有的所有元素做乘积("bc"),然后加到幂积里,此时为{c,bc};最后再加上自己"b",{b,c,bc} 倒数第三个:把自己(a)和幂积中所有元素做乘积{ab,转载 2011-03-12 11:21:00 · 1465 阅读 · 0 评论 -
散列技术
翻了一下数据结构的书,复习了散列的相关知识点,总结如下: 散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)计算出对应的函数值,把这个值解释为结点的存储地址,将结点存入到此存储单元中。在一般的情况下,散列表的空间必须比结点的集合大,此时虽然浪费了一定的空间,但是换取的是检索效率。散列的好坏依赖于散列函数的设计。散列函数可能对于不相等的关键码计算出相同的散列地址即发生冲突,发生冲突的两个关键码称为该散列函数的同义词。 采用散列技术时候原创 2011-03-12 21:46:00 · 1896 阅读 · 0 评论 -
使用C++实现二叉树
复习了二叉树,顺便用C++实现了二叉树及其相关的操作,下边是源代码(部分代码可能写得不够简洁,懒得改了~)BinaryTreeNode.h,用来定义二叉树的树结点结构#ifndef BINARYTREENODE_H#define BINARYTREENODE_Htemplatestruct BinaryTreeNode{ T data; BinaryTreeNode *left,*right,*parent; //每个结点有3个指针分别指向左右子节点以及父结点};#e原创 2011-03-14 10:42:00 · 1916 阅读 · 0 评论 -
堆排序
复习了堆,用C++写了一下,代码如下:#includeusing namespace std;enum Flag{Max,Min}; //Max为最大堆,Min为最小堆templatevoid exchange(T a,T b){ *a=*a+*b; *b=*a-*b; *a=*a-*b;}//保持堆性质templatevoid keepHeap(T a[],int pos,int length,Flag原创 2011-03-14 20:36:00 · 572 阅读 · 0 评论 -
各种排序算法代码C++版
<br />之前的博文中已经实现了堆排序,因此这里就不做包含<br />Sort.h<br />template<typename T>void exchange(T a,T b){ *a=*a+*b; *b=*a-*b; *a=*a-*b;}//插入排序template<typename T>T* InsertSort(T arr[],int length){ T* tmp=new T[length]; for(int i=0;i<length;i++) tm原创 2011-03-15 16:54:00 · 1318 阅读 · 0 评论 -
求zigzag矩阵
输入一个数字i,然后生成i×i的矩阵,矩阵的内容沿45度线递增如输入4,则矩阵为0 1 5 62 4 7 123 8 11 139 10 14 15注意:zigzag矩阵有以下特征Java源代码如下:import java.io.*;public class Zigzag { public static void main(String[] args) throws IOException { // TODO Auto-generated meth原创 2011-03-26 01:45:00 · 1927 阅读 · 0 评论 -
螺旋队列(由里向外)
假设有如下排列21 22 ......20 7 8 9 1019 6 1 2 1118 5 4 3 1217 16 15 14 131的坐标是(0,0), 3的坐标是(1,1),7的坐标是(-1,-1)分析第1层之内有1个数第2层之内有9个数第3层之内有25个数则第t层之内有(2t-1)^2个数。因而第t层的数从(2t-1)^2+1开始。给定(x,y),则t=max(|x|,|y|)分4种情况进行分析东|右:x==t,队列增长方向与Y轴一致,正东方向(原创 2011-03-26 10:39:00 · 1042 阅读 · 0 评论 -
螺旋队列(由外向里)
给定n,输出一个n*n的矩阵,矩阵元素排列如下(假设n=5)1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9分析:n=5,共需要n/2=2次循环对第一圈输出:1 2 3 4输出:5 6 7 8输出:9 10 11 12输出:13 14 15 16对第二圈输出:17 18 输出:19 20输出:21 22输出:23 24n%2==原创 2011-03-26 15:12:00 · 938 阅读 · 0 评论 -
编程之美 2.2阶乘中最低位0的个数&二进制表示中最低位1的位置
<br />/***************************问题描述**************************1. 给定一个整数N,那么N的阶乘N!末尾有多少个0?2. 求N!的二进制表示中最低位1的位置*************************************************************//************************问题1思路****************************N!=K*powe原创 2011-05-03 00:48:00 · 2213 阅读 · 1 评论