演算法設計--眾數和重數問題(分治法)
問題描述:
給定含有n個元素的多重集合S,每個元素在S中出現的次數稱為該元素的重數。多重集S中重數最大的元素稱為眾數。例如,S={1,2,2,2,3,5}。多重集S的眾數是2,其重數為3。對於給定的n個自然陣列成的多重集S,計算S的眾數及其重數 。
問題分析:
1、 分治法
分治法解題過程主要分為分、治、合三個步驟“,應用該方法的基本過程如下:
(1) 將原問題分解為若干個規模較小的子問題
(2) 對這些子問題分別求解
(3) 對各個子問題的解進行合併
2、 眾數:一組資料中出現次數最多的數值,叫眾數。有時一組資料中有多個眾數。
重數:重數是指該眾數出現的次數。
3、 根據以下例項理解分治法求解眾數及其重數
給定含有n個元素的多重集合S,每個元素在S中出現的次數稱為該元素的重數。多重集S中重數最大的元素稱為眾數。
例如,S = {1,2,2,2,3,5}。
多重集S的眾數是2,其重數是3.
演算法實現:
// Test_01.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
void split(int s[],int n,int &l,int &r){
int mid = n/2;
for(l = 0; l<n; ++l){
if(s[l] == s[mid])
break;
}
for(r = l+1;r<n;++r){
if(s[r] != s[mid])
break;
}
}
//num表示眾數 maxCnt表示重數
void getMaxCnt(int &mid,int &maxCnt, int s[],int n){
int l ,r;
split(s,n,l,r); //將陣列進行切割成兩端
int num = n/2;
int cnt = r - 1;
if(cnt > maxCnt){
maxCnt = cnt;
mid = s[num];
}
//l表示左邊的個數,左邊的個數必須大於中位數的個數,才有進行搜尋的意義
if(l+1 > maxCnt){
getMaxCnt(mid, maxCnt, s, l+1 );
}
//同理,右邊的個數將要大於中位數的個數才有繼續搜尋的意義,同時右邊陣列的起始位置進行改變
if(n-r > maxCnt){
getMaxCnt(mid, maxCnt, s+r, n-r);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int s[] = {1,2,2,2,3,5};
int n = sizeof(s)/sizeof(s[0]);
int maxCnt = 0;
int num = 0;
getMaxCnt(num ,maxCnt, s, n);
printf("%d %d\n",num,maxCnt);
return 0;
}
執行結果
由於初始陣列為int s[] = {1,2,2,2,3,5};所以執行結果中眾數為 2 重數為 3
2 3
請按任意鍵繼續. . .
相關推薦
演算法設計--眾數和重數問題(分治法)
問題描述: 給定含有n個元素的多重集合S,每個元素在S中出現的次數稱為該元素的重數。多重集S中重數最大的元素稱為眾數。例如,S={1,2,2,2,3,5}。多重集S的眾數是2,其重數為3。對於給定的n
演算法設計與分析第四周練習(圖論)
Network Delay Time 1. 題目 There are N network nodes, labelled 1 to N. Given times, a list of travel times as directed edges times[i
演算法設計與分析:Burst Balloons(Week 6)
學號:16340008 Question: Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums.
演算法設計與分析:Scramble String(Week 8)
學號:16340008 Question: Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursive
樹迴歸:CART演算法構建迴歸樹和模型樹(程式碼筆記)
分類迴歸樹(Classification And Regression Trees,CART)是一種構造樹的監督學習方法。 和ID3決策樹作比較: 1. ID3每次直接用最佳特徵分割資料,即如果當前特徵有4個可能值,那麼資料將被分成4份,處理的是標稱型資料,不能直接處理連續
響應式Web設計:HTML5和CSS3實戰(讀書筆記)
視口:瀏覽器視窗內的內容區域,不包含工具欄,標籤欄。網頁實際顯示. 螢幕尺寸:裝置物理顯示區域 各種寬度和高度 a、可視區的真實寬度和高度 document.documentElement.clientWid
排序演算法之氣泡排序和快速排序(Java版)
轉自:http://www.cnblogs.com/0201zcr/p/4763806.html 作者:Whywin 1、氣泡排序 演算法如下(排序後,由小到大排列): /** * 氣泡排序 * 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
PCA演算法的數學原理和C++語言(Eigen庫)實現
PCA演算法的數學原理最近在學習影象處理相關方面的知識,在影象壓縮時用到主成分分析演算法(Principal Component Analysis PCA)。數學理論主要參考了這篇部落格點選開啟連結,博主寫的非常好,通俗易懂。這裡總結了一下PCA演算法的實現步驟如下:設有m條
最大連續和(分治法)O(nlogn)
分解:將序列分解成元素個數儘量相等的子序列,求出每個子序列的最大連續和 合併:合併子問題得到原問題的解,由於最大連續和的子序列要麼完全在中點左邊,要麼完全在中點右邊,要麼就是橫跨左右兩邊,所以比較這幾
C語言實現快速排序法(分治法)
下一個 enter hang partition 等於 就是 tor log markdown title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true ---
合並排序(分治法)
for 數組 數組a 想要 -s fin size 外部 ... 使用分治法進行合並排序,問題描述參見:https://www.cnblogs.com/jingmoxukong/p/4308823.html 算法核心: //merge_sort.h #ifndef
快速排序(分治法)
ios type font nbsp def 註意 class 裏的 span 問題描述參考:http://blog.csdn.net/code_ac/article/details/74158681 算法實現部分: //random_quick_sort.cpp
平面最接近點對問題(分治法)
技術 src void emp image mage tar 分治 pac 問題描述參見:https://www.cnblogs.com/zyxStar/p/4591897.html 代碼參考:http://blog.csdn.net/qq_28666193/articl
Codeforces 448C Painting Fence(分治法)
劃分 .com 規劃 == sum tps codeforce nbsp 長度 題目鏈接:http://codeforces.com/contest/448/problem/C 題目大意:n個1* a [ i ] 的木板,把他們立起來,變成每個木板寬為1長為 a [ i
歸併排序(分治法)
橫向想了一下這幾個經典的排序演算法,個人感覺快排應該是速度最快了,首先快排在空間複雜度的角度應該開銷比歸併要小很多,因為歸併需要申請新的臨時空間,時間複雜度上雖說都是N*log(n)。但是同一個數量級上歸併有很多的陣列複製操作,感覺如果資料很大的話應該比快排所消耗的時間多很多(但是都是在一個數量級上,比如10
Java實現快速排序(分治法)
<span style="font-size:18px;">package com.alibaba; public class QuickSortTest { public stati
計算最大子段(分治法)
這個程式使用分治法計算最大子段,結果為最大子段之和,用遞迴程式實現。 原始資料使用隨機函式生成。 採用結構化程式設計,可以很容易改為從標準輸入或檔案讀入資料,只需要修改函式getData即可。 資料個數由巨集定義給出,也可以輕鬆地改為輸入。 /* * 最大子段演算法程
3_尋找假幣問題(分治法)
題目 一個袋子裡有30個銀幣,其中一枚是假幣,並且假幣和真幣一模一樣,肉眼很難分辨,目前只知道假幣比真幣重量輕一點。 請問,如何區分出假幣? 分析 首先,分析一下尋找假幣問題,採用遞迴分治的思想求解。 首先為每個銀幣編號,然後將所有的銀幣等分為兩份,
冪取模 (分治法)
int pow_mod(int a,int n,int m ) //a^n % m { if(n == 1) return a % m; int x = pow_mod(a,n/2,m); long long ans = (long lo
UVA - 1608 Non-boring sequences(分治法)
name 表示 urn its mes else pac 學習 tro 題目: 如果一個序列的任意連續的子序列中至少有一個只出現一次的元素,則稱這個序列是不無聊的。輸入一個n(n≤200000)個元素的序列A(各個元素均為109以內的非負整數),判斷它是不是不無聊的。 思路