摘要:排序演算法的一些實際應用,如小和問題,逆序對問題,基於非比較排序的相鄰兩數最大差值問題,
# -*- coding: utf-8 -*-
"""@project : python_
@author : 'zheng guoliang'
@file : class2.py
@function :
@time : 2018/12/23 15:51
"""import random
import copy
class sort_use(object):
# 小和問題 時間複雜度0(nlogn) 空間複雜度0(n)
def small_sum(self,nums):
if len(nums)<2:
return 0
return self.merge_sort(nums,0,len(nums)-1)
def merge_sort(self,nums,l,r):
if l>=r:
return 0
mid=l+((r-l)>>1)
return self.merge_sort(nums,l,mid)+self.merge_sort(nums,mid+1,r)+self.merges(nums,l,mid,r)
def merges(self,nums,l,mid,r):
i=lj=mid+1
help=
res=0
while i<=mid and j<=r:
if nums[i]nums[j]:
res+=nums[j]
return res
# 逆序對問題 時間複雜度0(nlogn) 空間複雜度0(n)
def reverse_order(self,nums):
if len(nums)<2:
return 0
return self.merge_sort_order(nums,0,len(nums)-1)
def merge_sort_order(self,nums,l,r):
if l>=r:
return 0
mid=l+((r-l)>>1)
return self.merge_sort_order(nums,l,mid)+self.merge_sort_order(nums,mid+1,r)+self.merges_order(nums,l,mid,r)
def merges_order(self,nums,l,mid,r):
i=lj=mid+1
res=0
help=
while i<=mid and j<=r:
if nums[i]<=nums[j]:
i+=1
else:
res+=(mid-i+1)
j+=1
while i<=mid:
i+=1
while j<=r:
j+=1
for i in range(0,r-l+1):
nums[i+l]=help[i]
return res
# 逆序對問題 時間複雜度0(n^2) 空間複雜度0(1)
def reverse_order1(self,nums):
if len(nums)<2:
return 0
res=0
for i in range(0,len(nums)-1):
for j in range(i+1,len(nums)):
if nums[i]>nums[j]:
res+=1
return res
#若排序後,相鄰兩數最大差值,不能用非基於比較的排序 時間複雜度0(n) 空間複雜度0(n)
def max_gap(self,nums):
if len(nums)<2:
return 0
max=nums[0]
min=nums[0]
for i in range(1,len(nums)):
max=max(max,nums[i])
min=min(min,nums[i])
if max == min :
return 0
lens=len(nums)
max_vec=[0 for i in range(lens+1)]
min_vec=[0 for i in range(lens+1)]
has_vec=[false for i in range(lens+1)]
for i in range(lens):
pos=int((nums[i]-min)*lens/(max-min))
max_vec[pos]=max(max_vec[pos],nums[i]) if has_vec[pos] else nums[i]
min_vec[pos]=min(min_vec[pos],nums[i]) if has_vec[pos] else nums[i]
has_vec[pos]=true
res=0
last_max=max_vec[0]
for i in range(1,lens+1):
if has_vec[i]:
res=max(res,min_vec[i]-last_max)
last_max=max_vec[i]
return res
#若排序後,相鄰兩數最大差值,基於比較的排序 時間複雜度0(nlogn) 空間複雜度0(1)
def max_gap1(self,nums):
if len(nums)<2:
return 0
nums.sort()
res=0
for i in range(1,len(nums)):
res=max(res,nums[i]-nums[i-1])
return res
def generate_data(n, l, r):
list =
for i in range(n):
a = random.randint(l, r)
# print(a,end=" ")
# print(end="\n")
return list
def print_data(nums):
for i in nums:
print(i, end=" ")
if __name__ == '__main__':
zgl=sort_use()
flag=true
for i in range(1,1000):
nums=generate_data(100,1,100)
nums1=copy.deepcopy(nums)
res=zgl.max_gap(nums)
res1=zgl.max_gap1(nums1)
if res!=res1:
print("error , res:",res," res1:",res1)
flag=false
break
if not flag:
print("error")
else:
print("ok")
近期要解決的一些問題
1 多微機上的多虛擬機器互聯問題 馬上進入碩士二年級的學習,因為本人的研究方向目前是集於大資料的應用,為了可以更好的 真實的生產環境,我想搭建乙個集於hdfs與spark的多節點計算集群,利用手頭上本導師的學生手上的幾台台式計算機,在上面分別依照效能執行幾台虛擬機器,最後互聯起來,利用實驗室已經建成...
利用二進位制解決一些問題
一 0和1 簡單規則 二 簡單題目總結 1 已知數n,檢測其k位 二進位制 是否置位 是否為1 n 1說明 1 左移 k 1位,變為 第k位為1,其他的位置為0.根據公式a和公式c,n的二進位制除k位之外,均變成0,而第k位與1 之後,原來是什麼還是什麼。如果是1,則結果一定大於0.如果是0.則最終...
利用反射建立物件的一些問題
所要構造的類如下所示 package getclass public class people private people string name public string getname public void setname string name override public strin...