我一直在尋找以下問題:魔法陣指數時間/空間複雜
神奇指數:魔術的索引數組
A[0...n-1]
被定義爲一個指數i
如A[i] = i
。給定排序的非明顯整數數組,請編寫一個方法來查找存在的魔術索引。
這裏是我的解決方案:
static int magicNonDistinct(int[] array, int start, int end) {
if (end < start) return -1;
int mid = start + (end - start)/2;
if (mid < 0 || mid >= array.length) return -1;
int v = array[mid];
if (v == mid) return mid;
int leftEnd = Math.min(v, mid - 1);
int leftRes = magicNonDistinct(array, start, leftEnd);
if (leftRes != -1) return leftRes;
int rightStart = Math.max(v, mid + 1);
int rightRes = magicNonDistinct(array, rightStart, end);
return rightRes;
}
它工作得很好,是從書破解代碼採訪第6版推薦的解決方案,解決8.3跟進(抱歉破壞)。
然而一個不同的陣列沒有魔索引上運行此時,它訪問的所有元素,產生運行爲O(n)的時間的最壞情況。
由於它是遞歸它需要O(n)的存儲器作爲最壞的情況。
該解決方案爲什麼會是最好只是遍歷數組了嗎?這個解決方案(我自己的)更好,我會爭辯:
static int magicNonDistinctV2(int[] array) {
for (int i = 0; i < array.length; ++i) {
int v = array[i];
if (v == i) return v;
if (v >= array.length) return -1;
else if (v > i) i = v - 1;
}
return -1;
}
O(n)運行時間O(1)空間總是?
有人能得出初步算法更好的時間複雜度?我一直在考慮看它是否爲O(d),其中d是不同元素的數量,但是由於最小/最大值僅在一個方向上起作用,所以該情況也是錯誤的(考慮如果v = 5, mid = 4
和該陣列全是五個)。
編輯:
好的人認爲我的香蕉,並儘快尖叫O(日誌(n))的,因爲他們看到的東西,看起來像二進制搜索。對不起,不清楚的人。
讓我們約在第一次發佈的代碼講我做(由鼎的解決方案):
如果我們有一個數組看起來像這樣:[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8]
,實際上是一個數組看起來像這樣:大小n
的[-1,...,n-2]
,我們知道沒有可匹配的元素。但是 - 該算法將訪問所有元素,因爲元素不是唯一的。我敢,運行它,它不能像普通的二進制搜索那樣將搜索空間除以2。請告訴我我的推理有什麼問題。
感謝您理解這個問題,但是您是否能夠獲得另一個時間複雜度,例如引入一個獨特的變量'd'或什麼的?如果沒有人回答更深入的問題,我會接受你的回答。 –