1. 程式人生 > >演算法設計--眾數和重數問題(分治法)

演算法設計--眾數和重數問題(分治法)

問題描述:
給定含有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 BalloonsWeek 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 StringWeek 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設計:HTML5CSS3實戰讀書筆記

視口:瀏覽器視窗內的內容區域,不包含工具欄,標籤欄。網頁實際顯示. 螢幕尺寸:裝置物理顯示區域 各種寬度和高度 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以內的非負整數),判斷它是不是不無聊的。 思路