ThreeColorsFlags

Posted on

ThreeColorsFlags

Algorithm Gossip: 三色棋

说明

三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。 假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。

解法

在一条绳子上移动,在程式中也就意味只能使用一个阵列,而不使用其它的阵列来作辅助,问题的解法很简单,您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移,如下所示: 三色旗 只是要让移动次数最少的话,就要有些技巧:

  1. 如果图中W所在的位置为白色,则W+1,表示未处理的部份移至至白色群组。
  2. 如果W部份为蓝色,则B与W的元素对调,而B与W必须各+1,表示两个群组都多了一个元素。
  3. 如果W所在的位置是红色,则将W与R交换,但R要减1,表示未处理的部份减1。 注意B、W、R并不是三色旗的个数,它们只是一个移动的指标;什么时候移动结束呢?一开始时未处理的R指标会是等于旗子的总数,当R的索引数减至少于W的索引数时,表示接下来的旗子就都是红色了,此时就可以结束移动,如下所示: 三色旗

演算法

Procedure MOVE(Flags[]) [ wFlag = 0; Flag = 0; rFlag = LENGTH(Flags[]) - 1; WHILE(wFlag <= rFlag) [ IF(Flags[wFlag] == 'W') [ wFlag = wFlag + 1; ] ELSE IF(Flags[wFlag] == 'B') [ SWAP(Flags[], bFlag, wFlag); bFlag = bFlag + 1; wFlag = wFlag + 1; ] ELSE [ WHILE(wFlag < rFlag && Flags[rFlag] == 'R') rFlag = rFlag - 1; SWAP(Flags[], rFlag, wFlag); rFlag = rFlag - 1; ] ] ]

实作

  • C /#include /#include /#include /#define BLUE 'b' /#define WHITE 'w' /#define RED 'r' /#define SWAP(x, y) { char temp; \ temp = color[x]; \ color[x] = color[y]; \ color[y] = temp; } int main() { char color[] = {'r', 'w', 'b', 'w', 'w', 'b', 'r', 'b', 'w', 'r', '\0'}; int wFlag = 0; int bFlag = 0; int rFlag = strlen(color) - 1; int i; for(i = 0; i < strlen(color); i++) printf("%c ", color[i]); printf("\n"); while(wFlag <= rFlag) { if(color[wFlag] == WHITE) wFlag++; else if(color[wFlag] == BLUE) { SWAP(bFlag, wFlag); bFlag++; wFlag++; } else { while(wFlag < rFlag && color[rFlag] == RED) rFlag--; SWAP(rFlag, wFlag); rFlag--; } } for(i = 0; i < strlen(color); i++) printf("%c ", color[i]); printf("\n"); return 0; }

  • Java import java.io./*; public class ThreeColorsFlags { private void swap(char[] flags, int x, int y) { char temp; temp = flags[x]; flags[x] = flags[y]; flags[y] = temp; } public String move(char[] flags) { int wFlag = 0; int bFlag = 0; int rFlag = flags.length - 1; while(wFlag <= rFlag) { if(flags[wFlag] == 'W') { wFlag++; } else if(flags[wFlag] == 'B') { swap(flags, bFlag, wFlag); bFlag++; wFlag++; } else { while(wFlag < rFlag && flags[rFlag] == 'R') rFlag--; swap(flags, rFlag, wFlag); rFlag--; } } return new String(flags); } public static void main(String[] args) throws IOException { BufferedReader buf; buf = new BufferedReader( new InputStreamReader(System.in)); System.out.print("输入三色棋顺序(ex. RWBBWRWR):"); String flags = buf.readLine(); ThreeColorsFlags threeColorsFlag = new ThreeColorsFlags(); flags = threeColorsFlag.move( flags.toUpperCase().toCharArray()); System.out.println("移动顺序后:" + flags); } }

linux下apache+tomcat集群详细配置_百度知道

Posted on

linux下apache+tomcat集群详细配置_百度知道

分享到

百度分享

百度首页 | 登录 注册

百度知道

百度知道 > 电脑/网络 > 程序设计 > 其他编程语言

linux下apache+tomcat集群详细配置

2010-5-26 14:17 提问者:ycdxg | 浏览次数:2607次

2010-5-28 00:22 最佳答案

环境: 操作系统均为:CentOS 5.1 Apache2.X服务器一台:IP地址192.168.232.4;安装路径/usr/local/apache; Tomcat6服务器一台:IP地址192.168.232.5;安装路径/usr/local/tomcat; Tomcat6服务器一台:IP地址192.168.232.6;安装路径/usr/local/tomcat; 配置: Apache安装: /#./configure --prefix=/usr/local/apache --enable-modules=so --enable-mods-shared=all --enable-proxy --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer --enable-rewrite 注释:激活tomcat集群需要的 enable-proxy,enable-proxy-http,enable-proxy-connect,enable-proxy-ajp和enable-proxy-balancer,其中proxy-ajp和proxy-balancer必须依赖proxy,如果是自定义的编译除了以上几个必须的模块外,mod_status也要编译进去,切记。enable-proxy-ftp可以不编译。 /#make;make install 制作Apache启动项: /#cp support/apachectl /etc/rc.d/init.d/httpd /#vi /etc/rc.d/init.d/httpd 添加以下内容:(包括#号) /# Startup script for the Apache Web Server /# chkconfig: 2345 85 15 /# description: Apache is a World Wide Web server .It is used to server /# HTML files and CGI. /# processname: httpd /# pidfile: /usr/local/apache/log/httpd.pid /# config: /usr/local/apache/conf/httpd.conf 增加服务项 /#chkconfig --add httpd /#chmod 755 /etc/rc.d/init.d/httpd /#chkconfig --level 345 httpd on JDK安装: /#chmod a+x jdk-6u4-linux-i586-rpm.bin /#./jdk-6u4-linux-i586-rpm.bin JAVA环境变量设置: /#vi /etc/profile 在文件最后添加以下内容: JAVA_HOME=/usr/java/jdk1.6.0_04 CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar PATH=$JAVA_HOME/bin:$PATH CATALINA_HOME=/usr/local/tomcat export JAVA_HOME CLASSPATH PATH CATALINA_HOME 执行如下命令使环境变量生效: source /etc/profile 测试配置是否成功: java –version Tomcat安装: /#wget [url]http://apache.mirror.phpchina.com/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.tar.gz[/url] /#tar zxvf apache-tomcat-6.0.16.tar.gz /#mv apache-tomcat-6.0.16 /usr/local/tomcat Tomcat随机启动: /#vi /etc/rc.local 添加以下内容: /usr/local/tomcat/bin/startup.sh tomcat6配置文件server.xml: 把 改成 说明: 第一台tomcat就把jvmRoute="tomcat1" 第二台tomcat就把jvmRoute="tomcat2" 把 去掉注释变为 ///群集详细配置/// 配置应用的web.xml: 在每个webapps应用中,修改配置文件web.xml文件 添加元素 在web.xml文件中元素下增加以下内容: 具体修改如下: 修改前: <?xml version="1.0" encoding="ISO-8859-1"?> 修改后: <?xml version="1.0" encoding="ISO-8859-1"?> 配置apache的ajp负载均衡功能: 确保将以下Module的注释去掉 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule status_module modules/mod_status.so 增加以下内容: /# Proxypass Config Include conf/extra/httpd-modproxy.conf 建立文件httpd-modproxy.conf输入内容: SetHandler server-status Order Deny,Allow Deny from all Allow from all SetHandler balancer-manager Order Deny,Allow Deny from all Allow from all ProxyRequests Off ProxyPass / balancer://tomcatcluster stickysession=jsessionid nofailover=On BalancerMember [url]http://192.168.232.5:8080[/url] loadfactor=1 BalancerMember [url]http://192.168.232.6:8080[/url] loadfactor=2 注释: ProxyRequests Off 表示启用反向代理,必须开启; ProxyPass为代理转发的Url,即将所有访问/的请求转发到群集balancer://tomcatcluster,这里为/即将所有访问/的请求转发到群集balancer://tomcatcluster的/test目录; BalancerMember为群集的成员,即群集服务器1或2,负载均衡服务器会根据均衡规则来将请求转发给BalancerMember; 调试负载均衡集群系统: 访问apache服务器的web服务:[url]http://192.168.232.4/balancer-manager[/url] 如果显示负载均衡有关信息则说明成功了,接着可以访问[url]http://192.168.232.4/[/url]即访问到了tomcat的应用 ///必须先启动Tomcat服务再启动Apache服务!/// 参考文档: [url]http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html[/url] [url]http://tomcat.apache.org/tomcat-6.0-doc/balancer-howto.html[/url] [url]http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/mod/mod_proxy.html[/url] [url]http://man.chinaunix.net/newsoft/ApacheMenual_CN_2.2new/mod/mod_proxy_balancer.html[/url]

赞同

5 | 评论(1)

向TA求助

回答者: xie8571756 | 四级采纳率:43%

擅长领域: 医疗健康 军事 奥运/赛事 羽毛球 历史话题

参加的活动: 暂时没有参加的活动

提问者对于答案的评价: 谢谢,非常详细 相关内容

查看同主题问题: linux 集群 配置

等待您来回答

推广链接 广东栢图广东 linux 培训 保就业 报名送高配置笔记本 高起点广东 linux 培训 ,广东省重点实验基地,总投资过亿,师资,设备,教学环境一流,入.. www.btlinux.cn 嘉瑞美深圳linux培训培训官方授权培训考试中心 深圳linux培训首选深圳嘉瑞美 RHCE全球通用认证 金牌红帽认证讲师精心指导0755-2398.. tech.kerysmart.com 信盈达linux培训,linux培训项目实战教学,包就业 linux培训结合企业真实项目,师傅带徒弟方式教学,linux培训ARM9内核,linux培训移植20.. www.edu118.com

用户名:

密码码:

记住我的登录状态

登 录 忘记密码

注册百度账号,遨游知识海洋

广东栢图广东 linux 培训 保.. 高起点广东 linux 培训 ,广东省重点实验基地,总投资过亿,师资,设备,教学环境一流,入.. www.btlinux.cn 嘉瑞美深圳linux培训培训官.. 深圳linux培训首选深圳嘉瑞美 RHCE全球通用认证 金牌红帽认证讲师精心指导0755-2398.. tech.kerysmart.com 信盈达linux培训,linux培训.. linux培训结合企业真实项目,师傅带徒弟方式教学,linux培训ARM9内核,linux培训移植20.. www.edu118.com 来百度推广其他编程语言

©2012 Baidu 使用百度前必读 | 知道协议 | 百度知道开放平台

FibonacciSearch

Posted on

FibonacciSearch

Algorithm Gossip: 费氏搜寻法

说明

二分搜寻法每次搜寻时,都会将搜寻区间分为一半,所以其搜寻时间为O(log(2)n),log(2)表示以2为底的log值,这边要介绍的费氏搜寻,其利用费氏数列作为间隔来搜寻下一个数,所以区间收敛的速度更快,搜寻时间为O(logn)。

解法

费氏搜寻使用费氏数列来决定下一个数的搜寻位置,所以必须先制作费氏数列,这在之前有提过;费氏搜寻会先透过公式计算求出第一个要搜寻数的位置,以及其代 表的费氏数,以搜寻对象10个数字来说,第一个费氏数经计算后一定是F5,而第一个要搜寻的位置有两个可能,例如若在下面的数列搜寻的话(为了计算方便, 通常会将索引0订作无限小的数,而数列由索引1开始): -∞ 1 3 5 7 9 13 15 17 19 20 如果要搜寻5的话,则由索引F5 = 5开始搜寻,接下来如果数列中的数小于指定搜寻值时,就往左找,大于时就向右,每次找的间隔是F4、F3、F2来寻找,当费氏数为0时还没找到,就表示寻找失败,如下所示: 费式搜寻 由于第一个搜寻值索引F5 = 5处的值小于19,所以此时必须对齐数列右方,也就是将第一个搜寻值的索引改为F5+2 = 7,然后如同上述的方式进行搜寻,如下所示:

费式搜寻 至于第一个搜寻值是如何找到的?我们可以由以下这个公式来求得,其中n为搜寻对象的个数: Fx + m = n Fx <= n

也就是说Fx必须找到不大于n的费氏数,以10个搜寻对象来说: Fx + m = 10

取Fx = 8, m = 2,所以我们可以对照费氏数列得x = 6,然而第一个数的可能位置之一并不是F6,而是第x-1的费氏数,也就是F5 = 5。 如果数列number在索引5处的值小于指定的搜寻值,则第一个搜寻位置就是索引5的位置,如果大于指定的搜寻值,则第一个搜寻位置必须加上m,也就是F5 + m = 5 + 2 = 7,也就是索引7的位置,其实加上m的原因,是为了要让下一个搜寻值刚好是数列的最后一个位置。 费氏搜寻看来难懂,但只要掌握Fx + m = n这个公式,自己找几个实例算一次,很容易就可以理解;费氏搜寻除了收敛快速之外,由于其本身只会使用到加法与减法,在运算上也可以加快。

实作

  • C /#include /#include /#include /#define MAX 15 /#define SWAP(x,y) {int t; t = x; x = y; y = t;} void createfib(void); // 建立费氏数列 int findx(int, int); // 找x值 int fibsearch(int[], int); // 费氏搜寻 void quicksort(int[], int, int); // 快速排序 int Fib[MAX] = {-999}; int main(void) { int number[MAX] = {0}; int i, find; srand(time(NULL)); for(i = 1; i <= MAX; i++) { number[i] = rand() % 100; } quicksort(number, 1, MAX); printf("数列:"); for(i = 1; i <= MAX; i++) printf("%d ", number[i]); printf("\n输入寻找对象:"); scanf("%d", &find); if((i = fibsearch(number, find)) >= 0) printf("找到数字于索引 %d ", i); else printf("\n找不到指定数"); printf("\n"); return 0; } // 建立费氏数列 void createfib(void) { int i; Fib[0] = 0; Fib[1] = 1; for(i = 2; i < MAX; i++) Fib[i] = Fib[i-1] + Fib[i-2]; } // 找 x 值 int findx(int n, int find) { int i = 0; while(Fib[i] <= n) i++; i--; return i; } // 费式搜寻 int fibsearch(int number[], int find) { int i, x, m; createfib(); x = findx(MAX+1,find); m = MAX - Fib[x]; printf("\nx = %d, m = %d, Fib[x] = %d\n\n", x, m, Fib[x]); x--; i = x; if(number[i] < find) i += m; while(Fib[x] > 0) { if(number[i] < find) i += Fib[--x]; else if(number[i] > find) i -= Fib[--x]; else return i; } return -1; } void quicksort(int number[], int left, int right) { int i, j, k, s; if(left < right) { s = number[(left+right)/2]; i = left - 1; j = right + 1; while(1) { while(number[++i] < s) ; // 向右找 while(number[--j] > s) ; // 向左找 if(i >= j) break; SWAP(number[i], number[j]); } quicksort(number, left, i-1); // 对左边进行递回 quicksort(number, j+1, right); // 对右边进行递回 } }

  • Java public class FibonacciSearch { public static int search(int[] number, int des) { int[] fib = createFibonacci(number.length); int x = findX(fib, number.length+1, des); int m = number.length - fib[x]; x--; int i = x; if(number[i] < des) i += m; while(fib[x] > 0) { if(number[i] < des) i += fib[--x]; else if(number[i] > des) i -= fib[--x]; else return i; } return -1; } private static int[] createFibonacci(int max) { int[] fib = new int[max]; for(int i = 0; i < fib.length; i++) { fib[i] = Integer.MIN_VALUE; } fib[0] = 0; fib[1] = 1; for(int i = 2; i < max; i++) fib[i] = fib[i-1] + fib[i-2]; return fib; } private static int findX(int[] fib, int n, int des) { int i = 0; while(fib[i] <= n) i++; i--; return i; } public static void main(String[] args) { int[] number = {1, 4, 2, 6, 7, 3, 9, 8}; QuickSort.sort(number); int find = Fibonacci.search(number, 3); if(find != -1) System.out.println("找到数值于索引" + find); else System.out.println("找不到数值"); } }

GCDPNumber

Posted on

GCDPNumber

Algorithm Gossip: 最大公因数、最小公倍数、因式分解

说明

最大公因数使用辗转相除法来求,最小公倍数则由这个公式来求: GCD /* LCM = 两数乘积

解法

最大公因数可以使用递回与非递回求解,因式分解基本上就是使用小于输入数的数值当作除数,去除以输入数值,如果可以整除就视为因数,要比较快的解法就是求出小于该数的所有质数,并试试看是不是可以整除,求质数的问题是另一个课题,请参考 Eratosthenes 筛选求质数

实作(最大公因数、最小公倍数)

  • C /#include /#include int main(void) { int m, n, r; int s; printf("输入两数:"); scanf("%d %d", &m, &n); s = m /* n; while(n != 0) { r = m % n; m = n; n = r; } printf("GCD:%d\n", m); printf("LCM:%d\n", s/m); return 0; }

  • Java public class GcdLcm { public static int gcdOf(int m, int n) { int r; while(n != 0) { r = m % n; m = n; n = r; } return m; } public static int lcmOf(int m, int n) { return m /* n / gcdOf(m, n); } public static void main(String[] args) { System.out.println("GCD of (10, 4) = " + GcdLcm.gcdOf(10, 4)); System.out.println("LCM of (10, 4) = " + GcdLcm.lcmOf(10, 4)); } }

实作(因式分解)

  • C(不用质数表) /#include /#include int main(void) { int i, n; printf("请输入整数:"); scanf("%d", &n); printf("%d = ", n); for(i = 2; i / i <= n;) { if(n % i == 0) { printf("%d / ", i); n /= i; } else i++; } printf("%d\n", n); return 0; }

  • C(使用质数表) /#include /#include /#define N 1000 int prime(int/); // 求质数表 void factor(int/, int); // 求factor int main(void) { int ptable[N+1] = {0}; int count, i, temp; count = prime(ptable); printf("请输入一数:"); scanf("%d", &temp); factor(ptable, temp); printf("\n"); return 0; } int prime(int/ pNum) { int i, j; int prime[N+1]; for(i = 2; i <= N; i++) prime[i] = 1; for(i = 2; i/i <= N; i++) { if(prime[i] == 1) { for(j = 2/i; j <= N; j++) { if(j % i == 0) prime[j] = 0; } } } for(i = 2, j = 0; i < N; i++) { if(prime[i] == 1) pNum[j++] = i; } return j; } void factor(int/ table, int num) { int i; for(i = 0; table[i] / table[i] <= num;) { if(num % table[i] == 0) { printf("%d / ", table[i]); num /= table[i]; } else i++; } printf("%d\n", num); }

  • Java(使用质数表) import java.util.ArrayList; public class Factor { public static int[] factor(int num) { int[] pNum = Prime.findPrimes(num); ArrayList list = new ArrayList(); for(int i = 0; pNum[i] /* pNum[i] <= num;) { if(num % pNum[i] == 0) { list.add(new Integer(pNum[i])); num /= pNum[i]; } else i++; } list.add(new Integer(num)); int[] f = new int[list.size()]; Object[] objs = list.toArray(); for(int i = 0; i < f.length; i++) { f[i] = ((Integer) objs[i]).intValue(); } return f; } public static void main(String[] args) { int[] f = Factor.factor(100); for(int i = 0; i < f.length; i++) { System.out.print(f[i] + " "); } System.out.println(); } }

FourNArray

Posted on

FourNArray

Algorithm Gossip: 4N 魔方阵

说明

奇数魔术方阵 相同,在于求各行、各列与各对角线的和相等,而这次方阵的维度是4的倍数。

解法

先来看看4X4方阵的解法: 4N 魔方阵 简单的说,就是一个从左上由1依序开始填,但遇对角线不填,另一个由左上由16开始填,但只填在对角线,再将两个合起来就是解答了;如果N大于2,则以 4X4为单位画对角线: 4N 魔方阵 至于对角线的位置该如何判断,有两个公式,有兴趣的可以画图印证看看,如下所示: 左上至右下:j % 4 == i % 4 右上至左下:(j % 4 + i % 4) == 1

实作

  • C /#include /#include /#define N 8 int main(void) { int i, j; int square[N+1][N+1] = {0}; for(j = 1; j <= N; j++) { for(i = 1; i <= N; i++){ if(j % 4 == i % 4 || (j % 4 + i % 4) == 1) square[i][j] = (N+1-i) / N -j + 1; else square[i][j] = (i - 1) / N + j; } } for(i = 1; i <= N; i++) { for(j = 1; j <= N; j++) printf("%2d ", square[i][j]); printf("\n"); } return 0; }

  • Java public class Matrix { public static int[][] magicFourN(int n) { int[][] square = new int[n+1][n+1]; for(int j = 1; j <= n; j++) { for(int i = 1; i <= n; i++){ if(j % 4 == i % 4 || (j % 4 + i % 4) == 1) square[i][j] = (n+1-i) / n -j + 1; else square[i][j] = (i - 1) / n + j; } } int[][] matrix = new int[n][n]; for(int k = 0; k < matrix.length; k++) { for(int l = 0; l < matrix[0].length; l++) { matrix[k][l] = square[k+1][l+1]; } } return matrix; } public static void main(String[] args) { int[][] magic = Matrix.magicFourN(8); for(int k = 0; k < magic.length; k++) { for(int l = 0; l < magic[0].length; l++) { System.out.print(magic[k][l] + " "); } System.out.println(); } } }