python小試牛刀: K-best演算法
"""
k-best解決的問題:
n個珠寶價值vi和重量wi;求保留k個珠寶的單位價值最大化
n,vi,wi 值域。。。
"""
def k_best(v_ls,w_ls,k):
l,r = 0.0, 1e5 #maximun 10,0000
while abs(r-l) > 1e-6:
mid = (l + r)/2.0
vw_ls = [v - mid * w for v,w in zip(v_ls, w_ls)]
choose = list(range(len(v_ls)))
for jj in range(k): #一個bug,序號會亂,因為排序後不;
for i in range(jj+1, len(v_ls)):
if vw_ls[jj] < vw_ls[i]:
vw_ls[jj], vw_ls[i] = vw_ls[i], vw_ls[jj]
choose[jj], choose[i] = choose[i], choose[jj]
sk = sum(vw_ls[0:k])
if sk < 0:
r = mid
else:
l = mid
return choose, mid
"""
choose = []
for jj in range(k): #一個bug,不應該設定為前幾個的;
c = 0
for i in range(jj+1,len(v_ls)):
if vw_ls[jj] < vw_ls[i]:
vw_ls[jj], vw_ls[i] = vw_ls[i], vw_ls[jj]
c = i
choose.append(c)
"""
if __name__ == "__main__":
# n,k = input("輸入珠寶數目n,待選數目k:")
# v_ls = []
# w_ls = []
# for i in range(int(n)):
# v,w = input("輸入珠寶價值,重量" ).split(',')#, input()
# v_ls.append(float(v))
# w_ls.append(float(w))
v_ls = [3,40,1.5,10,8]
w_ls = [1,20,1,5,4]
k = 3
print("list : ", v_ls, w_ls)
chose, mid = k_best(v_ls,w_ls, k)
print(chose, " value: ", mid)
print("\nchoose k: ")
for i in range(k):
print(v_ls[chose[i]], w_ls[chose[i]])
result:
list : [3, 40, 1.5, 10, 8] [1, 20, 1, 5, 4]
[0, 4, 3, 1, 2] value: 2.1000007109250873
choose k:
3 1
8 4
10 5
comment
- k-best目的是最優選取大集中的k個子集,是排序問題的進一步衍生。不單純能用排序解決,但是演算法也離不開排序。
- 比如上述最大價效比的k個珠寶問題:如果按照vi/wi的單個價效比選取可能不是最優的。因為如上述(3,1),(40,20),(1.5,1),按照單個價效比依次是3,2,1.5,選前兩個;但是實際上最優的是1、3,因為第三個質量小,不如第二個佔重大,使得和比值過於偏向40,20了。
- 值得注意的是,其中只涉及k個元素的排序,不必要排序所有,尤其集合n很大,選取k很小時候。複雜度O(kn),)(nn)會差異巨大。。。另外,可以用堆排序維持最小的k堆,或者隨機選擇來替代這裡的冒泡,複雜度降低到O(nlg(k)), O(k*lg(k)) ?; 因為k個元素的堆高度為lg(k)
相關文章
- Celery:小試牛刀
- python定時任務之小試牛刀Python
- vite plugins小試牛刀VitePlugin
- nodejs redis 小試牛刀NodeJSRedis
- Jena ARQ小試牛刀
- 貼吧小試牛刀
- 第2章 牛刀小試
- spring篇(一)牛刀小試Spring
- ElasticSearch學習一-小試牛刀Elasticsearch
- Java11 HttpClient小試牛刀JavaHTTPclient
- 分散式鎖--Redis小試牛刀分散式Redis
- Jmeter介面測試例項-牛刀小試JMeter
- Laravel 事件系統(一)、小試牛刀Laravel事件
- Vue.js 牛刀小試(持續更新~~~)Vue.js
- Abp小試牛刀之 圖片上傳
- 【小試牛刀】Stage-2 裝飾器初探
- 小試牛刀ElasticSearch大資料聚合統計Elasticsearch大資料
- constraintayout新功能montionLayout寫動畫小試牛刀AI動畫
- Golang框架Beego在Windows環境下小試牛刀Golang框架Windows
- Golang框架beego電影網爬蟲小試牛刀Golang框架爬蟲
- 【小白學PyTorch】8 實戰之MNIST小試牛刀PyTorch
- Flink Restart Strategies重啟策略機制深入剖析-Flink牛刀小試REST
- 現代IT基礎設施管理(1):Terraform初識和小試牛刀ORM
- 《流浪地球 2》 Deepfake 小試牛刀,45+ 吳京「被」年輕,變身 21 歲小鮮肉
- 【Vue.js 牛刀小試】03:第三章 - 事件修飾符的使用Vue.js事件
- 【Vue.js 牛刀小試】01:第一章 - 一些基礎概念Vue.js
- Flink 狀態管理與checkPoint資料容錯機制深入剖析-Flink牛刀小試
- Flink CheckPoint狀態點恢復與savePoint機制對比剖析-Flink牛刀小試
- 【Vue.js 牛刀小試】05:第五章 - 計算屬性與監聽器Vue.js
- Flink Window分析及Watermark解決亂序資料機制深入剖析-Flink牛刀小試
- 【Vue.js 牛刀小試】05:第五章 – 計算屬性與監聽器Vue.js
- Flink 叢集執行原理兼部署及Yarn執行模式深入剖析-Flink牛刀小試Yarn模式
- 智慧噴灑:計算機視覺在農業機械自動化領域的小試牛刀計算機視覺
- Flink基於Kafka-Connector 資料流容錯回放機制及程式碼案例實戰-Flink牛刀小試Kafka
- [Vue 牛刀小試]:第十六章 - 針對傳統後端開發人員的前端專案框架搭建Vue後端前端框架
- 《Spring 手擼專欄》第 2 章:小試牛刀(讓新手能懂),實現一個簡單的Bean容器SpringBean
- Python面試基礎題小彙總Python面試
- 【藍橋-大試牛刀7-最短路專場】一點提示