Python實現貪心演算法的示例

2022-09-25 22:54:14 字數 1951 閱讀 6464

今天乙個研究生同學問我乙個問題,問題如下:

超市有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,用貪心演算法演算法思想 對於給定的數列...