# 1092 Algorithm Ex2-C Report ###### tags: `courses` `Algorithm` > 108502586; 鍾安; :::info 檔案相關描述在 `README.md` 中 ::: ## 實驗 實驗中時間以 clock 來表示 1,000,000 clock = 1 second ### Input 有兩個整數 $N$ 與 $M$,代表兩數列 $A$ 與 $B$ 的大小 $$ A = {a_1, a_2, a_3, ..., a_N} \\ B = {b_1, b_2, b_3, ..., b_M} $$ ``` N M a_1 a_2 ... a_N b_1 b_2 ... b_M ``` ## Insert ### Method 1 程式會先 insert $N$ 個隨機數字,而後測試 insert 10,000 個數字所需的時間 $N$ 以 10,000 為級距,最大到 10,000,000 ![](https://i.imgur.com/xes0YMj.png) 在 y 軸以指數成長的狀態下,一維 array 的 insert 成 log 圖樣,因此一維 array 的 insert time 應為線性。 dynamic binary search structure 則是幾乎沒有什麼改變,這是因為每次的測試為 insert 10,000 個數字,而每次所需要動到的 array 都是前面那幾個,後面還有多少數字並不會影響。 ### Method 2 程式會先 insert 1 個隨機數字,而後測試 insert $M$ 個數字所需的時間 與 Method 1 的結果類似 ![](https://i.imgur.com/y5vZFtw.png) y 軸以指數成長: ![](https://i.imgur.com/vSP7Y6b.png) ### 小測資 程式會先 insert 1 個隨機數字,而後測試 insert $M$ 個數字所需的時間: ![](https://i.imgur.com/IA6SydA.png) 在輸入的測試資料偏小時,一維 array 的 insert 有時會比較快。 dynamic binary search 的時間雖然波動很大,但是還是可以看出趨勢並不是線性的,而是小於線性。 ## Search ### Method 1 程式會先 insert $N$ 個隨機數字,而後測試 search 10,000 個數字所需的時間 ![](https://i.imgur.com/OFiSMXZ.png) 由於此份資料沒有做平均計算,機此時間波動很大,無法看出趨勢。 但是仍可看出 dynamic binary search structure 需要花費更多的時間 > 嘗試著取平均,但是時間實在是花太久了,而且波動仍然很大。 > 或許需要再多寫一個沒有使用 IO 的程式來測 ## Deletion 先找到要刪除的元素所在的 array,稱為 $D$ 找到 index 最小的 array(不為空),稱為 $A$ 將 $A_0$ insert 到 $D$ (使用 1 維 binary search array 的方式) 將 $A$ 中剩餘的元素分散到比他小的那些 array 空間中 ### 例子: 若要刪除第 3 array 中的元素 則用第 2 array 的第一個元素去補齊第 3 array 然後再將第 2 array 剩餘元素依序填入第 1, 第 2 array 結果仍然符合規定 ```graphviz digraph { label="Step1\n" rankdir=LR node [shape=plaintext] dbsa [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="10"> <TR PORT="a0"> <TD> </TD> </TR> <TR PORT="a1"> <TD> </TD> <TD> </TD> </TR> <TR PORT="a2"> <TD PORT="target"><font color="blue">3</font></TD> <TD>4</TD> <TD>5</TD> <TD PORT="a2_end">6</TD> </TR> <TR PORT="a3"> <TD PORT="a3_start">7</TD> <TD>8</TD> <TD>9</TD> <TD><font color="red">10</font></TD> <TD>11</TD> <TD>12</TD> <TD>13</TD> <TD PORT="a3_end">14</TD> </TR> </TABLE> >]; A [label="A:\n the smallest array"] D [label="D:\n the array contained the\n element to be deleted"] dbsa:target:w -> dbsa:a3_start:w [label="insert"] dbsa:a2_end -> A [color=blue] dbsa:a3_end -> D [color=red] } ``` ```graphviz digraph { label="Step 2" rankdir=LR node [shape=plaintext] dbsa [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="10"> <TR PORT="a0"> <TD PORT="a0_start"> </TD> </TR> <TR PORT="a1"> <TD PORT="a1_start"> </TD> <TD> </TD> </TR> <TR PORT="a2"> <TD PORT="target"><font color="red">3</font></TD> <TD>4</TD> <TD>5</TD> <TD>6</TD> </TR> <TR PORT="a3"> <TD PORT="a3_start"><font color="blue">3</font></TD> <TD>7</TD> <TD>8</TD> <TD>9</TD> <TD>11</TD> <TD>12</TD> <TD>13</TD> <TD>14</TD> </TR> </TABLE> >]; dbsa:target:w -> dbsa:a0_start:w [label="split "] dbsa:target:w -> dbsa:a1_start:w } ``` ```graphviz digraph { label="Step 3 / DONE" node [shape=plaintext] dbsa [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="10"> <TR PORT="a0"> <TD PORT="a0_start">4</TD> </TR> <TR PORT="a1"> <TD PORT="a1_start">5</TD> <TD>6</TD> </TR> <TR PORT="a2"> <TD PORT="target"> </TD> <TD> </TD> <TD> </TD> <TD> </TD> </TR> <TR PORT="a3"> <TD>3</TD> <TD>7</TD> <TD>8</TD> <TD>9</TD> <TD>11</TD> <TD>12</TD> <TD>13</TD> <TD>14</TD> </TR> </TABLE> >]; } ``` ### 分析 假設 index 最小的 array 長度為 $M_1$,要刪除的元素所在的 array 長度為 $M_2$,全部內容物大小為 $N$ 補齊:$O(M_2)$ 分散:$O(M_1)$ Total: $O(M_2 + M_1)$ 將時間分散,平均: $O(\log n)$