0

我正在努力尋找一個相當典型的調度應用程序的好數據表示。有些混亂的要求是每個人每天都有一個隨意的可用性,並且在固定時間有或多或少的課程(儘管這裏也可能出現例外情況),而不管是否有兩方在那個時候可用或不可用。按位運算符進行過濾?

隨着挑戰之後的挑戰之一是尋找可用的預定課程的提供者,我想知道一個快速和優雅的方式是否可以簡單地將這些每週可用模式存儲在64位整數中的位掩碼。我的理由是,基本上,每天有24小時(10分鐘),每天有144個插槽(遠遠少於2^8)。因此,每個人每天都可以得到一個每天都是8位可用性掩碼的日程表(7 x 8位= 56位,小於64位整數)。

潛在用戶的過濾和識別可以通過將任何潛在的約會轉換爲相同類型的掩碼,然後只是按位操作來選擇在那裏可用的候選者而不會打擾進一步的規則等來完成。

我在想什麼是什麼原因是爲什麼我沒有看到更多的過濾發生在位級,因爲它似乎是相當直接的,我猜有希望實際上甚至最終會變得更優雅一個更詳細和明確的邏輯,任何想法/想法?

+1

Uhm不會144個插槽是144位掩碼,1個位用來指示每個插槽是否可用?在一個8位數字中,你只能說,用戶可以在第100個插槽中使用10分鐘。您可以使用8位掩碼,但每個工作日在「正常」8小時工作日內可用。但不是在144個插槽。但如果我錯了,請糾正我。 – EWit

+0

好點,我覺得非常愚蠢,因爲錯過了;-)事實上,在這種情況下,即使是8位掩碼也許就足夠了。總的來說,我對使用這種掩膜進行快速過濾頗感興趣,而且我還沒有真正看到過在我看過的任何Web項目中都做過這樣的事情,所以我想知道原因是什麼(或者如果我是隻是看着錯誤的項目...)所以原來的問題仍然與我有很高的相關性...... – Jonas

回答

3

典型案例premature optimization。讓程序首先運行,只有在程序運行緩慢時,才應該開始考慮使用按位運算優化它。您應該開始以最簡潔的方式實現它,例如通過使用矢量或布爾列表,例如不限於64的任意長度。

您可以使用例如numpy陣列與dtype=bool。這可能比手工編碼的比特向量稍小,但是免費獲得所有logical operations(您也可以使用像|, ^, & and ~這樣的運算符),並且在頂部可以具有幾乎無限的大小,允許切片,索引等。

+0

一方面,我直覺地認爲 - 但另一方面,這實際上基於簡單的優雅來到我的腦海。如果您只是使用一長串布爾值或向量,我不確定您如何能夠簡單地確保所有邊緣情況下的可用性在期間中等被中斷等等 - 所有這些按位操作都將被實際採用關心「免費」 - 您只需創建一個簡單的庫,該庫需要一個開始和結束時間和日期,並轉換爲您按位比較的按位模式。 – Jonas

+0

+1票爲布爾人名單 – blakev

+0

@Jonas什麼邊緣情況下?我沒有看到任何你可以用64位整數解決的情況,你無法使用布爾表的列表/數組。爲什麼浪費時間編寫自己的庫,當所有的功能已經在標準的Python或像numpy這樣的非常常見的外部庫中可用時。這恰恰是過早的優化:通過使用快速按位操作,您可能會節省幾秒鐘,但同時如果完成了,您已花了一週的時間來實現和調試庫。除非你這樣做是爲了好玩,當然,那麼你可以做任何你想要的... –