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 }

时间: 2024-10-14 01:48:50

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

有两个数组a,b,大小都为n,;通过交换a,b中的元素,使sum(a)-sum(b)最小。

有两个数组a,b,大小都为n,数组元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小. 当前数组a和数组b的和之差为    A = sum(a) - sum(b) a的第i个元素和b的第j个元素交换后,a和b的和之差为    A' = sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])           = sum(a) - sum(b) - 2 (a[i] - b[j])           = A

Ex 2_16 给定一个无穷数组..._第二次作业

先比较数组的A[0]元素,若不相等接下来比较A[1],A[2],A[4],A[8]-,若找到一个区间A[2n-1]<x<A[2n],再对这个区间进行折半查找操作.总的时间为O(logn). 若查找过程中A[i]中的i>n,则抛出异常 1 package org.xiu68.ch02.ex2; 2 3 import java.util.Random; 4 import java.util.Scanner; 5 6 public class Ex2_16 { 7 public static

Array.Sort 谷歌内核 数组大小超过10 排序字段都一致 返回的数组非原数组

1.如果数据大小小于等于10 都正常 2.数据大小大于10 3.js中Array.sort的实现原理 定义:sort() 方法用于对数组的元素进行排序. api语法:arrayObject.sort(sortby):参数sortby可选,用于规定排序规则,必须是函数. 具体是如何实现的? V8 引擎 sort 函数只给出了两种排序分别是: InsertionSort 和 QuickSort,数组长度小于等于 10 的用插入排序 InsertionSort,比10大的数组则使用快速排序 Quick

Ex 2_14 去掉数组中所有重复的元素..._第二次作业

首先利用归并排序算法对数组进行排序,时间复杂度为O(nlogn),接着再利用时间复杂度为O(n) 的去重复算法去掉数组中的重复元素.总的时间复杂度为O(nlogn). (这题应该用分支算法解决)以下为分支算法 代码不是分支算法 1 package org.xiu68.ch02.ex2; 2 3 public class Ex2_14 { 4 //基于分治法的归并排序算法 5 public static void main(String[] args) { 6 7 int[] a=new int[

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

求一个序列中的主元素

问题(2013 统考408真题):已知一个整数序列A = (a0,a1,...,an-1), 其中0≤ai≤n (0≤i<n).若存在ap1=ap2...=apm=x且m>n/2 (0≤pk≤n,1≤k≤m),则称x为A的主元素.例如,A=(0,5,5,3,5,7,5,5),则5为主元素,又如A=(0, 5, 5,3, 5, 1, 5,7),则A中没有主元素.假设A中的n个元素保存在一个一维数组中, 请设计一个尽可能高效的算法,找出A的主元素.若存在主元素,则输出该元素:否则输出-1. 解答:

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 思路一 寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中.如果哈希表中已经存在这个元素则说明这就是个重复元素.这种方法可以很方便的在O(n)时间内完成对重复元素的查找.可是题目要求在O(1)的空间.因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的.题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n

有一个有序数组,要求将一个新输入的数插入到数组中并保证插入新数后,数组仍有序。

因为数组在初始条件下是有序的,而题目要求插入新数后数组仍有序.因此,首先应该在数组中找到插入位置,然后将该位置原有的数以及该位置后面的数都依次后移一个位置,为新插入的数值空出一个位置. #include<stdio.h> int main() { int a[11] = {2, 4, 8, 15, 20, 36, 49, 51, 78, 96}; int temp1, temp2, number, end, i, j; printf("The original arry is:\n&

【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #include <stdio.h> #define col 4 #define rol 4 int yang(int(*p)[col], int num) { int i = 0; int j = col - 1; while (j+1) { int *q = &(p[i][j]); if