表驅動(直接訪問、索引訪問、階梯訪問)及別名演算法(Alias Method)
表驅動(直接訪問、索引訪問、階梯訪問)
目錄表驅動是一種程式設計模式(scheme),將複雜的邏輯從程式碼中獨立出來,便於單獨維護
直接訪問表 Direct Access
- 通過索引值(下標)直接從表中找到對應的條目
案例
案例1:(一維查詢:即可以代替一層的if結構或者switch結構):
比如你要查詢1--12月份每個月的天數,如下:
month_day[12] = {31,30,29,30,30,31,31,31,30,30,31,30}; return month_day[5];
這樣直接對應的就是5月的天數;
案例2:(三維查詢:即有三個條件同時限制,如果使用if 或者 switch 可能需要三層巢狀結構)
比如一個路由景點,收費標準因 性別,是否學生,以及是否殘疾 三項 共同決定門票的價格,那麼,我們可以
使用三維資料驅動表來代替 複雜的上層if 語句;
int entrance_ticket_fee[][][] =
{{ {0,10} , {0,15} }, { {0,15},{15,30} } }
這是一個三維向量,三個維度分別代表了不同的限制,
第一維代表性別,索引 0代表女,1 代表男;
第二維代表是否是學生,索引 0代表是,索引 1 代表不是;
第三維代表是否是殘疾, 索引 0代表殘疾, 索引 1代表健康;
以上這個三維陣列代表的是:
- 女孩,學生,殘疾 0元
- 女孩 ,學生,健康 10元;
- 女孩, 非學生,殘疾 0 元;
- 女孩, 非學生,非常急15元;
- 男孩,學生,殘疾 0元;
- 男孩,學生,健康,15元;
- 男孩,非學生,殘疾 15元;
- 男孩,非學生,健康,30元;
通過給定性別,是否是學生,是否殘疾,來確定其返回值;
return entrance_ticket_fee[0][1][1]; //15元;
索引訪問 Indexed Access
- 是一種間接訪問技術
- 先用一個基本型別的資料從一張索引表中查出一個鍵值,然後再用這一鍵值查出你感興趣的主資料
示例
假設你經營著一家商店,有大約100 種商品。再假設每種商品都 有一個4 位數字的物品編號, 其範圍是0000 到9999
如果你想用這個編號作為鍵值直接查詢一張描述商品信 息的表,那麼就要生成一個具有10000 條記錄的訪問表
個人理解,其實就是一種減少冗餘的方式
優點
- 如果主查詢表中的每一條記錄都很大,那麼索引陣列就 可以節省很多空間
- 操作位於索引 中的記錄有時也要比操作位於主表中的記錄更方便更廉 價
- 編寫到表裡面的資料比嵌入程式碼中的資料更容易維護
階梯訪問 Start-step Access
- 通過確定每項命中的階梯層次確定其歸類
案例
如果你正在開發一個等級評定的應用程式,按照如下等級區間 對分數定級
因為是浮點數,很難直接做出表,需要按照區間判斷
所以,我們把每一區間的上限寫入一張表裡,然後寫一個迴圈,按照各區間的上限來檢查分數。當分數第一次超過某個區間的上限時,你就知道相應的等級了
注意:
- 端點
- 可以二分查詢優化
隨機數生成
需求:
- 生成符合某種概率分佈的型別
解法一:階梯訪問
解設要生成的概率如下
可以將其累加,變成“階梯”
生成0~1的隨機數,判斷落在哪個區間,就屬於哪種型別
缺點:最多需要比較n次
解法二:別名演算法
如果有n種類型,就將其乘n
此時會有概率大於1的和小於1的,接下來就是構造出某種演算法用大於1的補足小於1的,使每種概率最後都為1,注意,這裡要遵循一個限制:每列至多是兩種概率的組合。
生成{1,2,3,4}
中的隨機數A,0~1的隨機數B
如果B>Prob{A}
,就選擇Alias{A},否則選擇A
reference
表驅動的認識以及用法——原創---非抄書_10891086的技術部落格_51CTO部落格