Ex 2_23 如果一个数组超过半数的元素都相同时,该数组被称为含有一个主元素..._第二次作业...

将数组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 }
View Code

 

转载于:https://www.cnblogs.com/xiu68/p/7989313.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值