演算法設計--眾數和重數問題(分治法)
問題描述:
給定含有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
請按任意鍵繼續. . .
相關文章
- 分治演算法-眾數問題演算法
- 分治法求眾數和重數(含檔案輸入輸出)
- ACM 眾數問題ACM
- 眾數問題分析
- 演算法題:求眾數演算法
- 求取眾數及重數的演算法實現(Java)演算法Java
- 【20190326】【每天一道演算法題】求眾數(分治演算法)演算法
- 挖坑填數+分治法:快速排序排序
- 斐波那契數列的分治法計算
- LeetCode169求眾數——分治LeetCode
- 【位操作筆記】位計數演算法 分治法統計 4 另外一個版本筆記演算法
- 【演算法解題報告】求眾數演算法
- 找眾數演算法演算法
- c++實現求眾數及其重數C++
- 演算法面試題彙總_2求眾數演算法面試題
- 演算法權重和問題演算法
- 求眾數、排序演算法、二分法排序演算法
- 【演算法】已知必存在眾數,求該眾數 -- Boyer-Moore 投票演算法演算法
- Python演算法:分治法Python演算法
- 【演算法】2 由股票收益問題再看分治演算法和遞迴式演算法遞迴
- 遞迴演算法程式設計整數因子分解問題的遞迴演算法遞迴演算法程式設計
- 分治演算法-求解棋盤覆蓋問題演算法
- 垃圾回收演算法:引用計數法演算法
- 【演算法】求眾數-js解法演算法JS
- 演算法:Majority Element(求眾數)演算法
- 【演算法練習】(8)眾數演算法
- 演算法之絕對眾數演算法
- 【LeetCode】【分治法】連續數列(最大子序和)思路解析和程式碼LeetCode
- ORACLE中科學計數法顯示問題的解決Oracle
- 模擬退火演算法Python程式設計(3)整數規劃問題演算法Python程式設計
- 優化的求眾數方法 - 摩爾投票演算法(演算法思想+求眾數的三種方法+摩爾投票演算法改進版求眾數 II)優化演算法
- 演算法學習筆記-暴力搜尋和分治法演算法筆記
- 質數填表問題的回溯演算法演算法
- 為什麼說物件導向程式設計和函數語言程式設計都有問題物件程式設計函數
- Python使用遞迴法和函數語言程式設計計算整數各位之和Python遞迴函數程式設計
- 分治法
- 演算法學習之路|科學計數法演算法
- 程式設計題-兩數相加程式設計