背景
最近有机器学习的任务,不可避免找上了python,语言简单,库多代码简洁,除了运行效率其他的没啥诟病,是个非常理想的机器学习首选开发语言。
入门阶段鄙人基本找的菜鸟教程,w3cschool等,因为其他的我暂时也没那个能力去理解。
在w3cschool的机器学习算法入门篇中,我看到了求数组众数的实现,其利用的是scipy包下的stats模块的mode函数,实现的算法思想是求数组中最小的众数,由于我不知道其还有没有求解所有众数的函数,故此自定义一个,一是满足自身虚荣感,而是填补求知欲。
思想
1.一个字典来维护每个数字出现的次数
2.一个集合来维护众数
3.遍历整个数组,对每个元素记录其出现的次数,若与集合中出现次数最大的数一致,则其也是众数,亦将其加入集合中。若其出现次数最大,则挤兑掉集合中其他数,其成为集合中唯一的元素
4.时间复杂度O(n)【仅遍历数组一次】,空间复杂度O(n)【一个集合,一个字典】
实现
arr=[86,86,86,86,87,87,87,87]
#返回所有众数
def mymode(arr):
d=dict()
result=set()
for item in arr:
if item in d.keys():
d[item]+=1
else:
d[item]=1
if len(result)==0:
result.add(item)
else:
pop=result.pop()
if d[pop]==d[item]:
result.add(pop)
result.add(item)
elif d[pop]>d[item]:
result=set([item])
return result,d
result,d=mymode(arr)
print(result)
print(d)
结果