用分治法求解主元素问题(python)
问题描述:
设 T [ 0 : n − 1 ] T[0:n-1] T[0:n−1]是n个元素的数组,如果其中某个元素x在整个数组中的出现次数超过n/2,则称x为数组 T T T的主元素。
代码:
def MajorElement(data):
left_data = []
right_data = []
if len(data) == 1:
return data[0]
#求中间位置
midindex = int(len(data)/2)
#将data分为左右两部分
for i in range(len(data)):
if i < midindex:
left_data.append(data[i])
else:
right_data.append(data[i])
#确定主元素
majorelement1 = MajorElement(left_data)
majorelement2 = MajorElement(right_data)
if majorelement1==majorelement2:
return majorelement1
else:
count1=0
count2=0
for i in range(len(data)):
if data[i]==majorelement1:
count1=count1+1
if data[i]==majorelement2:
count2=count2+1
if count1>len(data)/2:
return majorelement1
if count2>len(data)/2:
return majorelement2
else:
majorelement='null'
return majorelement
测试代码1:
data=[1,2,3,4,5,8,6,4,7,3,9,5,5,5,5,5,5,5,5,5,5,5]
majorelement=MajorElement(data)
print(majorelement)
结果:
如果输入数据由文txt文件提供。文件的第1行为数组S中元素个数n;接下来的n 行中,每行有一个自然数。程序运行结束时,将计算结果输出到txt文件中。输出文件中包含问题的答案:找不到主元素时给出null,找到时给出主元素的值。
测试代码:
data = np.loadtxt("D:\Algorithm\input3.txt",int,encoding='utf-16')
print(data)
majorelement=MajorElement(data)
print(majorelement)
# 写入TXT文件中
with open("D:\Algorithm\input3.txt","a+",encoding='utf-16')as f:
f.write('主元素是:')
f.write(str(majorelement))
结果:
分析:
时间复杂性可由递推式表示:
T
(
n
)
=
2
T
(
n
/
2
)
+
O
(
n
)
T(n)=2T(n/2)+O(n)
T(n)=2T(n/2)+O(n),即
T
(
n
)
=
O
(
n
l
o
g
n
)
T(n)=O(nlogn)
T(n)=O(nlogn)