2016-04-25 106 views
0

我試圖解決的問題是,我有路由表路由表優化

  • | SRC | DEST |口|
  • | a | b | p1 |
  • | a | b | p2 |
  • | a | b | p3 |
  • | a | c | p1 |
  • | a | d | p2 |
  • | a | e | p3 |

這可以優化

  • | SRC | DEST |口|
  • | a | b | p1,p2,p3 |
  • | a | c | p1 |
  • | a | d | p2 |
  • | a | e | p3 |

其可進一步優化,以

  • | SRC | DEST |口|
  • | a | b,c | p1 |
  • | a | b,d | p2 |
  • | a | b,e | p3 |

我想用3維表示來解決這個問題,但是檢索將會複雜化。 我需要使用最好的數據結構來解決這個用例。

+0

因爲它是多餘的,所以不會進一步優化來刪除'src'列嗎?至少在這個例子中。 –

+0

@Brent來源可以是任何東西。這只是一個用例 – Prashant

+0

第一次優化允許src,dest的唯一組合,而第二次優化允許唯一的端口(單值dest或端口)。你打算使用哪一個? –

回答

0

數據結構是一組值爲dest的值集合,其中第一組由src值加密,第二組由port值加密。此基團dest值由srcport

src => port => [dest] 

在Python中,這可以用字典來完成:

table = (
    ('a','b','p1'), 
    ('a','b','p2'), 
    ('a','b','p3'), 
    ('a','c','p1'), 
    ('a','d','p2'), 
    ('a','e','p3'), 
) 

optimized = {} 
for route in table: 
    src, dest, port = route 
    o = optimized.get(src, {}) 
    p = o.get(port, []) 
    p.append(dest) 
    o[port] = p 
    optimized[src] = o 

for src,route in optimized.iteritems(): 
    for port,dest in route.iteritems(): 
     print src, dest, port 

結果(在未排序的順序)爲:

a ['b', 'd'] p2 
a ['b', 'e'] p3 
a ['b', 'c'] p1 

的查找可以使用:

dest = optimized[src][port] 
+0

謝謝布倫特回答。我能夠將其優化到這個級別。我已將您的代碼添加到https://ideone.com/PQNlwo 其中有輸入表格表格=( ('a','b','p1'), ('a','b','p2 '), ('a','b','p3'), ('a','c','p1'), ('a','d','p2'), '','e','p3'), ('b','c','p1'), ('b','d','p2'), ('b',' e','p3')) 輸出: a ['b','d'] p2 a ['b','e'] p3 a ['b','c'] p1 b ['d'] p2 b ['e'] p3 b ['c'] p1 ----但是在這個等級上我們也可以得到另一個等級o使用最小規則集輸出。 a,b,[p1,p2,p3] [a,b],c,p1 [a,b],d,p2 [a,b],e,p3 – Prashant