今天乙個研究生同學問我乙個問題,問題如下:
超市有m個顧客要結賬,每個顧客結賬的時間為ti( i取值從1到m)。超市有n個結賬出口,請問全部顧客怎麼選擇出口,可以最早完成全部顧客的結賬,並用**實現。
其實利用的就是貪心演算法來解決這個問題,那麼,什麼是貪心演算法?怎麼用貪心演算法解決這個問題?讓我一一道來。
貪心演算法是一種對某些求最優解問題的更簡單、更迅速的設計itdtwsid技術。貪心演算法的特點是一步一步地進行,常以當前情況為基礎根據某個優化測度作最優選擇,而不考慮各種可能的整體情況,省去了為找最優解要窮盡所有可能而必須耗費的大量時間。貪心演算法採用自頂向下,以迭代的方法做出相繼的貪心選擇,每做一次貪心選擇,就將所求問題簡化為乙個規模更小的子問題程式設計客棧,通過每一步貪心選擇,可得到問題的乙個最優解。雖然每一步上都要保證能獲得區域性最優解,但由此產生的全域性解有時不一定是最優的,所以貪心演算法不要回溯 。
可以先讓前n個人付款 後邊顧客不斷找出付款時間最短的依次排到前n個顧客按時間最長到最短的後邊
可以先假設只有乙個收銀台,那麼我們可以很快的反應過來,最優的順序就是按時間由小到大依次進行。
即最優解為a=(其中t(i)為第i個使用者需要的服務時間),則每個使用者等待時間為:
t(1)=t(1);t(2)=t(1)+t(2);…t(n):t(1)+t(2)+t(3)+……t(n);
那麼總等待時問,即最優值為:
ta=n*t(1)+(n-1)*t(2)+…+(n+1-j)t(i)+…2t(n-1)+t(n);
有了上邊的分解,那麼實現演算法**就非常的輕而易舉了`
def greedy(customer_list, n):
# customer_time_list為第j個佇列上的某乙個顧客的等待時間
# sum_customer_time_list是求和陣列
# sum_customer_time_list[j]的值為第j個佇列上所有顧客的等待時間
# min_sum_customer_time為結賬最小時間
# 初始化乙個大小為n的0列表
customer_time_list =
sum_customer_time_list =
num = 0
while num < n:
customer_time_list.append(0)
sum_customer_time_list.append(0)
num += 1
min_sum_customer_time = 0
# 顧客的數量
m = len(cust
customer_list.sort() #列表公升序排序
i = 0
j = 0
while i < m:
customer_time_list[j] += customer_list[i]
sum_customer_time_list[j] += cuwww.cppcns.comstomer_time_list[j]
i += 1
j += 1
# 如果j到了最後乙個結賬出口,重新歸零
if j == n:
j = 0
# 彙總最小總時間
k = 0
while k < n:
min_sum_customer_time += sum_customeritdtwsid_time_list[k]
k += 1
return min_sum_customer_time
準備乙個顧客排隊序列和指定收銀台數量,得到最小時間
customer_list = [6, 5, 3, 4, 2, 1]
print(greedy(customer_list, 2))
程式主要是花費在對各顧客所需服務時間的排序和貪心演算法,即計算平均服務時間上面。其中,貪心演算法部分只有一重迴圈影響時間複雜度,其時間複雜度為o(n):而排序演算法的時間複雜度為o(nlogn)。因此,綜合來看演算法的時間複雜度為o(nlogn)。
python實現貪心演算法
在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解 是否是全域性最優,需要證明 問題 有一天海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件都價值連城,一旦打碎就是去了價值,海盜船載重量為c,每件固定的重量為wi,海盜們該如何盡可能...
python 貪心演算法的實現
貪心演算法 貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的...
python貪心演算法極差問題 極差的貪心演算法實現
1 極差的貪心演算法實現,數列極差問題描述 給定,n,個正整數數列,進行如下操作 每次刪去兩個數,a,和,b,添,加乙個數,a b 1,直到只剩乙個數,n,在所,有這樣的,n,中,有乙個最大,max,和最小,min,m max min,是極差。設計程式計算,m,用貪心演算法演算法思想 對於給定的數列...