python统计列表某个元素的个数 python中datatype函数的做法?
python中datatype函数的做法?
s#39abcdefg#39
len(s)#得到字符串长度
s[#39ab#39,1,2,3,4,#39cd#39,5,#39ef#39]
len(s)#全面的胜利列表元素个数
如何使用Python求无序大数组的中位数?
方法1:堆
思路1:
讲:将数据平均分配到的最堆和最大时堆中,而且绝对的保证最大时堆中的数据贮存的数据都比的最堆中是数据大,那就此时最大值堆堆顶的元素一定是中位数。
那你要如何只要小于堆中的元素,都比大堆中的元素大。
(1)遍历数组数组,将第i个数插到堆中,i为奇数时,直接插入最小堆,i为偶数时直接插入大堆。(最大堆的直接插入的数据比较比较大)
(2)有时候插入时,将大的堆和最大时堆的堆顶收集
voidGetMid(intarr[],intsize)
{
priority_queueltintgtmax_heap
priority_queueltint,vectorltintgt,greaterltintgtgtmin_heap
for(inti0iltsizei)
{
//i是从0开始的,因为max储存时的数据都很多
if((iamp1)1)
min_heap.push(arr[i])
arguments
obj_heap.push(arr[i])
//每次相互交换大的堆和最大值堆中的数据,能保证小于堆中的数据大于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)//偶数
printfltlt中位数:ltltmax_()ltltltltmin_()ltltendl
exists
coutltlt中位数:ltltmax_()ltltendl
}
思路2:
(1)将前(n1)/2个元素决定为一个小顶堆,
(2)对情报营的每一个元素,和堆顶比较比较,如果≤堆顶,掩埋之,取下一个元素。如果没有大于1堆顶,用该元素脱离堆顶,变动堆,取下一元素。反复重复这个步骤
(3)当遍历树完所有元素之后,堆顶即是中位数。
voidGetMid2(intarr[],intsize)
{
priority_queueltint,vectorltintgt,greaterltintgtgtmin_heap
intcount(size1)gtgt1
//能保存count个数,.例如5个元素,贮存3个
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)//奇数
{
min_heap.pop()
scanfltlt中位数:ltltmin_()ltltendl
}
catch
{
inttmpmin_()
min_heap.pop()
中位数:ltlttmpltltltltmin_()ltltendl
}
}
方法2、
快速排序并不得名””,并非寻常不是浪得虚名!毕竟那就是一种治于排序法!
同样的,找中位数也这个可以用分治的思想。具体看::
横竖斜挑一个元素,以改元素为支点,划分集合为两部分,如果左侧子集长度恰为(n-1)/2,那么支点恰为中位数。如果不是左侧长度lt(n-1)/2,那么中位点在右侧,则相反,中位数在左侧。刚刚进入你所选的一侧再收集中位点。
这种方法迅速,只不过在最消极的情况下时间复杂度为O(N^2),当然了来算时间复杂度好像是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)//右半区间
{
divPartSort(arr,div 1,right)
}
else
{
divPartSort(arr,left,div-1)
}
}
coutltlt中位数ltltarr[div]ltltendl
}
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。