昨天去某廠面試數據挖掘,遇到了這麼一道題面試
一個二維矩陣,右邊的數值比左邊的大,下邊的數值比上邊的大,設計一種算法,快速查找某個指定數字的位置算法
以下表所示的數據:spa
查找值: | 117 | |||||||||
——>右邊的比左邊的大 | ||||||||||
下邊的比上邊大 | 0 | 8 | 15 | 19 | 24 | 29 | 36 | 43 | 47 | 50 |
18 | 22 | 27 | 32 | 41 | 47 | 51 | 54 | 64 | 71 | |
35 | 39 | 49 | 59 | 66 | 75 | 80 | 82 | 86 | 93 | |
48 | 56 | 66 | 70 | 79 | 83 | 95 | 101 | 106 | 113 | |
73 | 83 | 88 | 94 | 100 | 106 | 115 | 123 | 130 | 136 | |
84 | 91 | 99 | 109 | 117 | 127 | 130 | 134 | 143 | 146 | |
105 | 111 | 114 | 120 | 128 | 134 | 143 | 152 | 155 | 158 | |
125 | 129 | 136 | 139 | 147 | 152 | 160 | 168 | 171 | 178 | |
139 | 148 | 154 | 160 | 168 | 175 | 182 | 187 | 197 | 202 | |
154 | 163 | 171 | 181 | 184 | 194 | 203 | 210 | 218 | 223 |
在現場比較緊張,並且也不夠時間,沒有想出好的解決方法,今天上班時間折磨了一會,發現了這麼一個好方法設計
時間複雜度估計就O(max(n,m))這樣子吧,沒有具體證實ci
基本的原理就是二分查找+對角限制數據挖掘
假設矩陣是n*m的table
首先用二分查找找到最右列上比待查找值大的最小值,在上表中的話就是136class
而後在最左列查找比待查找值小的最大值,在上表中的話就是105原理
這樣就把待查找範圍限制在下表範圍內方法
73 | 83 | 88 | 94 | 100 | 106 | 115 | 123 | 130 | 136 |
84 | 91 | 99 | 109 | 117 | 127 | 130 | 134 | 143 | 146 |
105 | 111 | 114 | 120 | 128 | 134 | 143 | 152 | 155 | 158 |
接下來翻轉比較,用二分查找找到最下面一行中比待查找值大的最小值,即120
而後在最上面一行查找比117小的最大值,即115
這樣就把待查找範圍限制在下表範圍內
94 | 100 | 106 | 115 |
109 | 117 | 127 | 130 |
120 | 128 | 134 | 143 |
接下來繼續翻轉比較,找到左右倆邊知足條件的最大值與最小值,即109和130
這樣就把待查找範圍限制在下表範圍內
109 | 117 | 127 | 130 |
接下來一步二分查找便可匹配到117了,至此查找完畢......
某廠的面試官,給點機會吧親。。。