• 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
  • 相关阅读:
    移动传感器扫描覆盖
    最小生成树
    什么是壳 脱壳篇01
    最小生成树
    最小生成树
    最小生成树
    最小生成树
    最小生成树
    普里姆算法
    普里姆算法
  • 原文地址:https://www.cnblogs.com/xiu68/p/7989313.html
Copyright © 2020-2023  润新知