1. 程式人生 > 其它 >表驅動(直接訪問、索引訪問、階梯訪問)及別名演算法(Alias Method)

表驅動(直接訪問、索引訪問、階梯訪問)及別名演算法(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部落格

表驅動法(Table-Driven Approach) | 海嶼 (zhangchen915.com)

Alias Method解決隨機型別概率問題(別名演算法) - 飛翔的賀蘭豬 - 部落格園 (cnblogs.com)