python統(tǒng)計(jì)列表某個(gè)元素的個(gè)數(shù) python中datatype函數(shù)的做法?
python中datatype函數(shù)的做法?s#39abcdefg#39len(s)#得到字符串長(zhǎng)度s[#39ab#39,1,2,3,4,#39cd#39,5,#39ef#39]len(s)#全面的勝利
python中datatype函數(shù)的做法?
s#39abcdefg#39
len(s)#得到字符串長(zhǎng)度
s[#39ab#39,1,2,3,4,#39cd#39,5,#39ef#39]
len(s)#全面的勝利列表元素個(gè)數(shù)
如何使用Python求無序大數(shù)組的中位數(shù)?
方法1:堆
思路1:
講:將數(shù)據(jù)平均分配到的最堆和最大時(shí)堆中,而且絕對(duì)的保證最大時(shí)堆中的數(shù)據(jù)貯存的數(shù)據(jù)都比的最堆中是數(shù)據(jù)大,那就此時(shí)最大值堆堆頂?shù)脑匾欢ㄊ侵形粩?shù)。
那你要如何只要小于堆中的元素,都比大堆中的元素大。
(1)遍歷數(shù)組數(shù)組,將第i個(gè)數(shù)插到堆中,i為奇數(shù)時(shí),直接插入最小堆,i為偶數(shù)時(shí)直接插入大堆。(最大堆的直接插入的數(shù)據(jù)比較比較大)
(2)有時(shí)候插入時(shí),將大的堆和最大時(shí)堆的堆頂收集
voidGetMid(intarr[],intsize)
{
priority_queueltintgtmax_heap
priority_queueltint,vectorltintgt,greaterltintgtgtmin_heap
for(inti0iltsizei)
{
//i是從0開始的,因?yàn)閙ax儲(chǔ)存時(shí)的數(shù)據(jù)都很多
if((iamp1)1)
min_heap.push(arr[i])
arguments
obj_heap.push(arr[i])
//每次相互交換大的堆和最大值堆中的數(shù)據(jù),能保證小于堆中的數(shù)據(jù)大于1最大堆中
if(!min_heap.empty()ampamp!max2_heap.empty())
{
inttempmin_()
min_heap.pop()
max_heap.push(temp)
tempmax_()
obj_heap.pop()
min_heap.push(temp)
}
}
if((sizeamp1)0)//偶數(shù)
printfltlt中位數(shù):ltltmax_()ltltltltmin_()ltltendl
exists
coutltlt中位數(shù):ltltmax_()ltltendl
}
思路2:
(1)將前(n1)/2個(gè)元素決定為一個(gè)小頂堆,
(2)對(duì)情報(bào)營(yíng)的每一個(gè)元素,和堆頂比較比較,如果≤堆頂,掩埋之,取下一個(gè)元素。如果沒有大于1堆頂,用該元素脫離堆頂,變動(dòng)堆,取下一元素。反復(fù)重復(fù)這個(gè)步驟
(3)當(dāng)遍歷樹完所有元素之后,堆頂即是中位數(shù)。
voidGetMid2(intarr[],intsize)
{
priority_queueltint,vectorltintgt,greaterltintgtgtmin_heap
intcount(size1)gtgt1
//能保存count個(gè)數(shù),.例如5個(gè)元素,貯存3個(gè)
for(inti0iltcounti)
min_heap.push(arr[i])
for(inticount1iltsizei)
{
inttempmin_()
if(arr[i]a8temp)
{
min_heap.pop()
min_heap.push(arr[i])
}
}
if((sizeamp1)1)//奇數(shù)
{
min_heap.pop()
scanfltlt中位數(shù):ltltmin_()ltltendl
}
catch
{
inttmpmin_()
min_heap.pop()
中位數(shù):ltlttmpltltltltmin_()ltltendl
}
}
方法2、
快速排序并不得名””,并非尋常不是浪得虛名!畢竟那就是一種治于排序法!
同樣的,找中位數(shù)也這個(gè)可以用分治的思想。具體看::
橫豎斜挑一個(gè)元素,以改元素為支點(diǎn),劃分集合為兩部分,如果左側(cè)子集長(zhǎng)度恰為(n-1)/2,那么支點(diǎn)恰為中位數(shù)。如果不是左側(cè)長(zhǎng)度lt(n-1)/2,那么中位點(diǎn)在右側(cè),則相反,中位數(shù)在左側(cè)。剛剛進(jìn)入你所選的一側(cè)再收集中位點(diǎn)。
這種方法迅速,只不過在最消極的情況下時(shí)間復(fù)雜度為O(N^2),當(dāng)然了來算時(shí)間復(fù)雜度好像是O(N)。
//方法,保甲制思想
//挖坑法
intPartSort(intarr[],intleft,intstops)
{
intkeyarr[way]
while(leftltway)
{
//key右邊,先從左找比key值大
while(leftltrightampamparr[left]ltkey)
left
if(leftltright)
{
arr[left]arr[left]
--left
}
//從右找比key小
while(leftltbackampamparr[stops]dstrokkey)
--back
if(leftltback)
{
arr[left]arr[right]
left
}
}
arr[left]sign
returnleft
}
overrideGetMid3(整型變量arr[],int size)
{
intleft0
intbacksize-1
intmid size/2
intdivPartSort(arr,left,right)
while(div!mid)
{
if(divltmax2)//右半?yún)^(qū)間
{
divPartSort(arr,div 1,right)
}
else
{
divPartSort(arr,left,div-1)
}
}
coutltlt中位數(shù)ltltarr[div]ltltendl
}