将数组A划分为两个数组A1和A2 ,各含有A的一半元素或一半多一个.若A中含有主元素x,则A1和A2中至少有一个数组含有主元素x,对A1和A2递归地计算有无主元素,若A只含有一个元素,则A的主元素就是这个元素,否则计算出A1和A2的主元素x1和x2:
若x1和x2都不存在,则A不存在主元素
若x1和x2有一个存在,则检查这个元素是否为A的主元素
若x1和x2都存在且不相等,则分别检查这个元素是否为A的主元素
若x1和x2都存在且相等,则这个元素就是A的,主元素
1 package org.xiu68.ch02.ex2; 2 3 public class Ex2_23a { 4 5 public static void main(String[] args) { 6 //n个元素的数组,相同元素个数大于一半称为主元素,元素之间不能比较大小,可以作相等比较 7 //以O(nlogn)时间确定数组是否含有主元素 8 //String[] strs=new String[MAX_LENGTH]; 9 10 String[] strs2=new String[]{"aa","bb","cc","aa","aa","bb","cc","aa","aa"}; 11 12 Sal s2=countPrime(strs2,0,strs2.length-1); 13 14 if(s2!=null) 15 System.out.println(s2); 16 } 17 18 //求数组中p到q间的主元素 19 public static Sal countPrime(String[] strArr,int p,int q){ 20 //如果只有一个元素,这个元素就是主元素 21 if(p==q) 22 return new Sal(strArr[p],1); 23 int partLength=q-p+1; //元素个数 24 int middle=p+partLength/2; //元素中间位置 25 26 Sal first=countPrime(strArr,p,middle-1); //前一部分的主元素 27 Sal second=countPrime(strArr,middle,q); //后一部分的主元素 28 29 //前半部分和后半部分都没有主元素,则没有主元素 30 if(first==null && second==null) 31 return null; 32 33 //后半部分有主元素,则遍历数组确定后半部分的主元素是否为前后两部分的主元素 34 if(first==null && second!=null) 35 return countPart(strArr,partLength, p, middle-1, second.getStr(), second.getCount()); 36 37 //前半部分有主元素,则遍历数组确定前半部分的主元素是否为前后两部分的主元素 38 if(first!=null && second==null) 39 return countPart(strArr,partLength, middle, q, first.getStr(), first.getCount()); 40 41 //前后两部分都有主元素 42 if(first!=null && second!=null){ 43 //若主元素相同,则这个元素就是整个部分的主元素 44 if(first.getStr().equals(second.getStr())) 45 return new Sal(first.getStr(),first.getCount()+second.getCount()); 46 else{ 47 //主元素不相同,则分别计算前后两部分的主元素是否为整个部分的主元素 48 Sal temp=countPart(strArr,partLength, p, middle-1, second.getStr(), second.getCount()); 49 if(temp!=null) 50 return temp; 51 return countPart(strArr,partLength, middle, q, first.getStr(), first.getCount()); 52 } 53 } 54 55 return null; 56 } 57 58 59 //计算某个元素是否为某一部分的主元素 60 public static Sal countPart(String[] strArr,int partLength,int p,int q,String k,int firstNum){ 61 62 int lastNum=0; 63 for(int i=p;i<=q;i++){ 64 if(strArr[i].equals(k)) 65 lastNum++; 66 } 67 int finalNum=firstNum+lastNum; 68 if(finalNum>(partLength/2)) 69 return new Sal(k,finalNum); 70 return null; 71 } 72 73 } 74 75 76 class Sal{ 77 private String str; //主元素 78 private int count; //主元素个数 79 80 public Sal(){} 81 public Sal(String str, int count) { 82 super(); 83 this.str = str; 84 this.count = count; 85 } 86 public String getStr() { 87 return str; 88 } 89 public void setStr(String str) { 90 this.str = str; 91 } 92 public int getCount() { 93 return count; 94 } 95 public void setCount(int count) { 96 this.count = count; 97 } 98 99 public String toString(){ 100 return "主元素:"+this.getStr()+",个数"+this.getCount(); 101 } 102 }