文章列表
 
您正在查看 "Algorithms" 分类下的文章

2009年08月03日 星期一 20:05

给定任意一个复式字符串,都能够对其进行拆分,得到全部单式字符串的集合。例如,对于使用空格分隔的复式字符串3,41,20 1,2,33,5 3,18来说,每个元素不是单个的字符,而且其中的每个元素可以是任意的字符串,对其进行拆分,可以考虑构造一种通用的数据结点,来实现拆分。

下面定义一种结点,结点具有一个element的数据域,这里定义为字符串String类型,另外每个结点对应任意个指针域,可以定义一个指针的列表。

Java类CommonNode定义如下所示:

package org.shirdrn.splitter;

import java.util.Lis

 
2009年08月02日 星期日 22:17

对于形如字符串123,123,123,123,123,123的复式字符串,将其拆分成单式:333333,333332,333331,……,111111,最笨的方式就是根据逗号分隔的个数写多个循环进行拼接。如果复式字符串很长,用这种方式拆分效率会很低的。

我考虑构造一种类似三叉树的图结构,但是又不同于三叉树,其实是一个图,但是为了求得拆分的单式字符串,需要根据树的结构来遍历,所以暂且称之为树吧。

实现思想如下:

复式字符串用逗号分组,每组元素的数目为3(例如上面就是1和2和3),在树形结构中,每一个元素作为一个结点,每一层最

 
2009年07月31日 星期五 13:20

n-皇后问题描述:

在n×n格的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,求解满足条件的棋盘布局。

n-皇后问题是典型的可以使用回溯算法求解的问题。

下面是n-皇后问题的实现求解算法,先给出使用C语言的实现,再转成Java实现。可以通过详细的程序注释来了解求解过程。

C语言实现如下所示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 8

int column[N];
int che

 
2009年07月30日 星期四 8:05

n-皇后问题描述:

在n×n格的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,求解满足条件的棋盘布局。

n-皇后问题是典型的可以使用回溯算法求解的问题。如果你明白了问题的具体执行过程,也就对该问题的特点有了把握,从而选择合适的算法去求解。

以8-皇后问题为例,假设皇后所在的行用变量row表示,对应的列使用数组column[row]表示。

使用回溯算法执行的过程如下:

(1)第一次放置第1个皇后

将第1个皇后放在第0行第0列,即row=0,co

 
2009年07月28日 星期二 9:31

背包问题描述如下:

已知有一个可容纳重量为C的背包以及n件物品,其中第i件物品的重量为wi,每件物品的价值为pi(pi>0)。怎样向背包装如物品,才能使装入背包的物品的价值最大?

贪心算法求解背包问题基本思想:

将n件物品的价值/重量比求出(价值/重量比,也就是单位重量物品的价值),然后按照非递增排序。装入过程,从价值/重量比最大的物品开始装入,直到某一件物品不能全部装入背包的时候,停止装入,而要对最后一件不能全部装入的物品进行部分装入,将背包装满,总价值达到最大。

如果全

 
2009年07月24日 星期五 21:34

基本思想

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

(1)初始状态:无序区为R[1..n],有序区为空。

(2)第1趟排序: 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1] 交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

(3)第i趟排序: 第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1)。 该趟排序从当前无序区中选出关键

 
2009年07月24日 星期五 15:30

贪心算法实现缩水处理的思想就是:

每次从待处理集合S中选择出一个能够覆盖集合S中最多字符串的一个字符串s1,将s1放入缩水处理后集合T中,将s1从S中删除掉,这样执行了一次选择过程;

再从S-{s1}中选择出一个能够覆盖集合S-{s1}中最多字符串的一个字符串s2,将s2放入到T中,并将s2从S中删除掉;

……

反复执行,直到S={}时计算终止,产生缩水处理的集合T为所求。

基于上面思想,实现的代码如下所示:

package org.shirdrn.shrink;

import java.util.ArrayList;

 
2009年07月22日 星期三 23:16

基本思想

堆的定义:

n个关键字序列Kl,K2,…,Kn称为堆,当且仅当该序列满足如下性质(简称堆性质):

(1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤FLOOR(n/2))

若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满 足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若 存在)结点的关键字。

根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。

根结点(亦称为堆顶)的关键

 
2009年07月21日 星期二 18:33

基本思想

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

(1)初始状态:

无序区为R[1..n],有序区为空。

(2)第1趟排序:

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1] 交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

(3)第i趟排序:

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1)。 该趟排

 
2009年07月21日 星期二 10:43

基本思想

设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:

(1) 分解:

在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间 中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos) 上,它无须参加后续的排序。

注意:

 
2009年07月21日 星期二 10:43

基本思想

将被排序的记录数组R[0..n-1]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根 据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其 向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

(1)初始: R[0..n-1]为无序区。

(2)第一趟扫描:从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者 在上,则交换二者的位置。即依次比较(R[n-1],R[n-2]),(R[n-2],R[n-

 
2009年07月21日 星期二 10:42

基本思想

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

算法实现(Java语言)

package org.shirdrn.internal.sort;

/**
* <p><B>希尔排序算法类</B>
* <p>基本思想:
* <p

 
2009年07月16日 星期四 23:48

基本思想

直接插入排序的基本思想是:

假设待排序的记录存放在数组R[0..n-1]中。初始时,R[0]自成1个有序区,无序区为R[1..n-1]。 从i=1起直至i=n-1为止,依次将R[i]插入当前的有序区R[0..i-1]中,生成含n个记录的有序区。

算法实现(Java语言)

直接插入排序算法的Java实现如下:

package org.shirdrn.internal.sort;

/**
* <p><B>直接插入排序算法类</B>
* <p>基本思想:
* <p>
* <p>假设待

 
2009年07月15日 星期三 17:53

网上拷贝一段:

60年代挪威数学家就开始研究TOTO式足球彩票缩水理论,自80到90年代,由于TOTO足球彩票在挪威、丹麦、瑞典及法国、意大利十分流行,因此有一批学者便潜心研究足彩的优化缩水问题。在90年代初13场比赛的TOTO最优解已被全部证明。美国人Gail Howard发明的“旋转矩阵”组合法是一个计算复杂且很有特色的组合方法,使用此方法造就了若干位大奖得主。这是对那些“彩票软件无用论”者的一个很好的反驳。在此简要介绍一下足彩缩水法的数学原理。在数学上,一个复式投注单假设有n个三

 
2009年06月22日 星期一 15:22

现在有这样的需求:

存在一个类似{31311133,33113330}这样的集合,经过8取5组合,其他位置用非字母数字字符替代,比如使用*号,得到类似{3***1133,***13330,... ...}这样的集合;

还要求对于{3***1133,***13330}这样的集合,再次经过5取3组合,其他位置用非字母数字字符替代,比如使用*号,得到类似{*****133,*****330,3***1*3*,... ...}这样的集合。

对于这样的要求,实现的思路如下:

首先,主要思想是基于信息编码原理,通过扫描字符串,将10组合变为01组合。

其次,对于每个数字字符串,

 
   
 
 
文章存档
 
     
 
最新文章评论
  

这个不错,很详细,对于我们初学spring框架的人不错的帮助,感谢楼主分享
 

最近用,学习了~
 

[表情]
 

[表情]
 

对于Ubuntu用户,有一个简单的办法: 将该用户添加到admin用户组,即 usermod -G adm
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu