Re: [請益] 請問學哪個比較實用
※ 引述《remmurds (雷穆爾德‧小一)》之銘言:
: ※ 引述《Smurf (哈里歐)》之銘言:
: : 我表達能力不夠好 讓大大誤會了 想學C++是因為我想知道封裝的實作細節
: : 例如Java的ArrayList其實就是先預設一個size
: : 超過這個size要重新配置 所以元素太多時用ArrayList效能會降低
: : LinkedList的實做就是Double Linked List資料結構 要用哪個視情況而定
: 你還是沒看懂我在說什麼。想知道封裝的細節跟想學C++有什麼絕對的關連?請自行
: 搜尋一下天●書局的網站,看看那些以資料結構為主題的書是不是都只用C++。
: 再強調一次,就資料結構或演算法而言,學哪種語言根本不是重點。如果一開始就被
: 語言綁住,就會像我一個學弟先前鬧出的笑話:「我學的是Python,我沒辦法寫鍊結串列
^^^^
這裡我稍有些疑議,我以為linked list就是綁在C或C++這種指標串連資料結構的語言.
如果選用別的語言,linked不linked可能都不重要.
像 Erlang 好了,list就是愛連就連,不用也不會像陣列一樣用太多空間,因為底層的
抽像機已經把一些linked的結構做好了. 它所謂linked list就是:
[1|[2|[3|[]]]]
語法上省略寫為
[1,2,3]
所謂linked就是一個結構包含另一個結構.
Linked list則是結構的包含方式比較有規律.
在這方面,我覺得要說語言不重要,在linked list上面不是如此.
Linked list用C或C++寫才會特別把link帶出來. 用Python,談什麼link呢?
而真要說不被語言綁住的,是stack,queue,tree,graph這些language-free的東西.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.68.175
→
02/20 21:40, , 1F
02/20 21:40, 1F
→
02/20 21:41, , 2F
02/20 21:41, 2F
→
02/20 21:47, , 3F
02/20 21:47, 3F
→
02/20 21:48, , 4F
02/20 21:48, 4F
→
02/20 21:48, , 5F
02/20 21:48, 5F
→
02/20 21:52, , 6F
02/20 21:52, 6F
→
02/20 21:53, , 7F
02/20 21:53, 7F
→
02/20 21:53, , 8F
02/20 21:53, 8F
→
02/20 21:54, , 9F
02/20 21:54, 9F
→
02/20 21:55, , 10F
02/20 21:55, 10F
→
02/20 21:55, , 11F
02/20 21:55, 11F
推
02/20 23:04, , 12F
02/20 23:04, 12F
→
02/20 23:05, , 13F
02/20 23:05, 13F
→
02/20 23:48, , 14F
02/20 23:48, 14F
→
02/20 23:49, , 15F
02/20 23:49, 15F
→
02/20 23:51, , 16F
02/20 23:51, 16F
→
02/20 23:52, , 17F
02/20 23:52, 17F
→
02/20 23:54, , 18F
02/20 23:54, 18F
→
02/20 23:55, , 19F
02/20 23:55, 19F
推
02/20 23:55, , 20F
02/20 23:55, 20F
→
02/20 23:56, , 21F
02/20 23:56, 21F
→
02/20 23:57, , 22F
02/20 23:57, 22F
→
02/20 23:57, , 23F
02/20 23:57, 23F
→
02/21 00:16, , 24F
02/21 00:16, 24F
→
02/21 00:18, , 25F
02/21 00:18, 25F
→
02/21 00:18, , 26F
02/21 00:18, 26F
→
02/21 00:19, , 27F
02/21 00:19, 27F
推
02/21 02:17, , 28F
02/21 02:17, 28F
→
02/21 02:17, , 29F
02/21 02:17, 29F
→
02/21 02:18, , 30F
02/21 02:18, 30F
→
02/21 02:18, , 31F
02/21 02:18, 31F
→
02/21 08:09, , 32F
02/21 08:09, 32F
→
02/21 08:10, , 33F
02/21 08:10, 33F
→
02/21 08:12, , 34F
02/21 08:12, 34F
→
02/21 08:13, , 35F
02/21 08:13, 35F
→
02/21 08:14, , 36F
02/21 08:14, 36F
例如,要做個key-value的linked list,結構是這樣:
[{Key,Value},Next]
Next如果是空節點,表達為 [].
串列建立函數是
create() -> [].
加入新節點是
add([], Node) -> [Node,[]];
add([L|List], Node) -> [L|add(List,Node)].
所以先 L1 = add([], {a, 100}):
add([], {a,100}) -> [{a,100},[]]
再 L2 = add(L1, {b, 200}):
add([{a,100},[]], {b,200}) -> [{a,100}|add([],{b,200}]
-> [{a,100}|[{b,200},[]]] -> [{a,100},{b,200},[]]
再 L3 = add(L2, {c, 300}):
add([{a,100},{b,200},[]], {c,300}) -> [{a,100}|add([{b,200},[]],{c,300})]
-> [{a,100}|[{b,200}|add({c,300},[])]]
-> [{a,100}|[{b,200}|[{c,300},[]]]] -> [{a,100},{b,200},{c,300},[]]
而以上依序插入 {a,100}, {b,200}, {c,300} 的結果可以寫成一個普通的list:
[{a,100},{b,200},{c,300}]
節點插入函數是O(N)的走訪與O(1)的插入,
insert(LList, 1, [Data,_]) -> [Data|LList];
insert([L|List], N, [Data,_]) when N > 1 -> [L|insert(List,N-1,
[Data,[]])];
insert(LList, _, _) -> LList.
這一點linked list和普通list沒有差別.
以前面試考過的串列倒排,可以做得一模一樣. 如果有一列串列是
[{a,100},{b,200},{c,300},[]]
除了第一節點之外,後面節點是走訪到就把節點抓出來放到串列前端,
[{a,100},{b,200},{c,300},[]]
-> [{b,200}|[{a,100},{c,300},[]]]
-> [{c,300}|[{b,200}|[{a,100},[]]]]
-> [{c,300},{b,200},{a,100},[]]
串列倒排函數是
reverse([]) -> [];
reverse([Data,[]]) -> [Data,[]];
reverse([First,Second|Next]) -> [NH|NT] = reverse_partial([First|Next]),
[NH, Second | NT].
reverse_partial([F,S|Next]) -> [S | revesre([F|Next])].
但這樣寫起來好麻煩,倒是以下這種標準型好寫一點;只是缺點是慢一點點:
rev([]) -> [];
rev([H|T]) -> rev(T) ++ [H].
另外有比較快的,用一個額外的變數累積結果的技巧:
reverse(Any) -> rev(Any, []).
rev([], Result) -> Result;
rev([H|T], Part) -> rev(T, [H|Part]).
使用Python這種有函數風格的語言,
思考資料結構的方式或許不同,但內涵一樣有相當多的東西可引用.
這是我的一點意見.
※ 編輯: yauhh 來自: 61.231.68.175 (02/21 09:32)
推
02/21 09:27, , 37F
02/21 09:27, 37F
→
02/21 09:27, , 38F
02/21 09:27, 38F
還有 31 則推文
還有 3 段內文
推
02/22 01:15, , 70F
02/22 01:15, 70F
→
02/22 01:15, , 71F
02/22 01:15, 71F
→
02/22 01:15, , 72F
02/22 01:15, 72F
→
02/22 01:34, , 73F
02/22 01:34, 73F
→
02/22 01:39, , 74F
02/22 01:39, 74F
→
02/22 01:40, , 75F
02/22 01:40, 75F
→
02/22 01:42, , 76F
02/22 01:42, 76F
→
02/22 01:42, , 77F
02/22 01:42, 77F
推
02/22 01:46, , 78F
02/22 01:46, 78F
→
02/22 01:46, , 79F
02/22 01:46, 79F
→
02/22 01:46, , 80F
02/22 01:46, 80F
→
02/22 01:48, , 81F
02/22 01:48, 81F
推
02/22 01:49, , 82F
02/22 01:49, 82F
→
02/22 01:49, , 83F
02/22 01:49, 83F
→
02/22 01:49, , 84F
02/22 01:49, 84F
→
02/22 01:50, , 85F
02/22 01:50, 85F
→
02/22 01:50, , 86F
02/22 01:50, 86F
→
02/22 02:00, , 87F
02/22 02:00, 87F
→
02/22 02:01, , 88F
02/22 02:01, 88F
→
02/22 02:01, , 89F
02/22 02:01, 89F
→
02/22 02:02, , 90F
02/22 02:02, 90F
推
02/22 02:02, , 91F
02/22 02:02, 91F
推
02/22 02:09, , 92F
02/22 02:09, 92F
→
02/22 12:22, , 93F
02/22 12:22, 93F
→
02/22 12:22, , 94F
02/22 12:22, 94F
→
02/22 12:23, , 95F
02/22 12:23, 95F
→
02/22 12:23, , 96F
02/22 12:23, 96F
→
02/22 12:24, , 97F
02/22 12:24, 97F
→
02/22 12:25, , 98F
02/22 12:25, 98F
→
02/22 12:26, , 99F
02/22 12:26, 99F
推
02/22 13:53, , 100F
02/22 13:53, 100F
→
02/22 13:54, , 101F
02/22 13:54, 101F
→
02/22 13:54, , 102F
02/22 13:54, 102F
→
02/22 13:55, , 103F
02/22 13:55, 103F
→
02/22 13:56, , 104F
02/22 13:56, 104F
→
02/22 13:56, , 105F
02/22 13:56, 105F
→
02/22 13:57, , 106F
02/22 13:57, 106F
→
02/22 13:57, , 107F
02/22 13:57, 107F
→
02/22 13:58, , 108F
02/22 13:58, 108F
→
02/22 19:56, , 109F
02/22 19:56, 109F
討論串 (同標題文章)