12-java算法设计.pptVIP

  • 5
  • 0
  • 约4.6千字
  • 约 18页
  • 2018-04-23 发布于河南
  • 举报
12-java算法设计

java算法设计 本章主要内容: 1、静态类方法 2、代数运算 3、密码术 4、排序与查找 5、递归 6、动态数据结构 1、静态类方法 有些方法的价值在于提供方便、高效的工具,并不需要实例化。 例:java.lang.Math类 public final class Math { private Math() {} public static double random() {...} static使我们可以不需要创建该类的对象就使用该方法。 1、范例:华氏与摄氏温度转换 2、代数运算 在博弈游戏中,常可以找到必胜局的数学模式,根据其可以设计必胜算法。 小棍游戏OneRowNim 共21根小棍,让对手面对1、5、9、13、17、21根小棍时,你总是能赢。 sticksLeft%4==1是必胜局 当sticksLeft%4 != 1,(sticksLeft-1)%4是最佳取走小棍数,可以造成必胜局 当sticksLeft%4 == 1,是对手的必胜局,只有随机走。 2、范例:小棍游戏的必胜算法 public int ComputerMove() { int sticksLeft = nim.getSticks(); if (sticksLeft%4 != 1) return (sticksLeft-1)%4; else { int maxPickup=Math.min(3,sticksLeft); return 1+(int)(Math.random()*maxPickup); } } 3、密码术 使用复杂的数学方法对消息加密和解密。 凯撒密码:每个字母由其后的第三个字母替换。 明文:abcdefghijklmnopqrstuvwxyz 密文:defghijklmnopqrstuvwxyzabc 通用的替换密码:使用一个关键字建立替换字母表。 例:关键字xylophone 明文:abcdefghijklmnopqrstuvwxyz 密文:xylophneabcdefgijkmqrstuvwz 3、范例:凯撒密码 public String encode(String word) { StringBuffer result = new StringBuffer(); for (int k=0;kword.length();k++) { char ch = word.charAt(k); ch = (char)(‘a’+(ch-’a’+3)%26); result.append(ch); } return result.toString(); } public String decode(String word) {... ch=(char)(‘a’+(ch-’a’+23)%26);...} 4、排序和查找 在众多数据中设计高效的查询算法,常需要借鉴经典的排序和查找策略. 选择排序: 每一次遍历从待排序列中选取一个关键码最小的记录,第二趟从剩下的n-1个记录中选取关键码最小的记录,直到整个序列的记录选完。这样便得到按关键码有序的序列。 折半查找: 在有序表中,取中间元素作为比较对象,若给定值与中间元素的关键码相等,则查找成功;若给定值小于中间元素的关键码,则在中间元素的左半区继续查找;若给定值大于中间元素的关键码,则在中间元素的右半区继续查找。不断重复上述查找过程,直到查找成功,或所查找的区域无数据元素,查找失败。 4、范例:选择排序 public void selectionSort(int arr[]) { int smallestCard; for (int k=0;karr.length-1;k++) { smallestCard = k; for (int i=k+1;iarr.length;i++) if (arr[i]arr[smallestCard]) smallestCard = i; if (smallestCard != k) swap(arr,k,smallestCard); }//for outerloop }//selectionSort private void swap(int arr[],int el1,int el2) { int temp=arr[el1]; arr[el1]=arr[el2];arr[el2]=temp;} 4、范例:折半查找 public int binarySearch(int arr[],int key) { int low=0; int high=arr.length-1; while(low=high) { int m

文档评论(0)

1亿VIP精品文档

相关文档