在序列中查詢元素,如果序列有序,可以採用折半查詢等方法,只與數列的規模n有關係,但因為數列擺動,比如3,出現在3個位置,所以不能縮小查詢的規模,只能遍歷完整個陣列。所以最基本的想法是從頭至尾便利序列,如果找到3,列印當前位置,陣列遍歷完後,沒有找到就輸出相應的資訊。這樣複雜度為o(n),需要n次比較。
這只是最基本的查詢,我們沒有用到差的絕對值為1這個條件,利用這個條件恰恰可以決定乙個步進,就不用按照每次步進1去掃瞄數列了。
如果第乙個元素值為x,需要查詢的元素為y,我們定義x、y之間的距離為d = |y-x|;而絕對值本身就是距離,也就是說,該數列相鄰的元素距離為1,那如果查詢元素和第乙個元素之間的距離為d,那麼待查詢元素(如果有存在)至少應該在d的位置處(x的位置為0,這是最好情況,即數列遞增或者遞減),或者更遠(數列擺動),所以我們從0位置直接跳到d處,然後以d處的元素為基準,重新計算y和a[d]的距離,進一步選擇跳躍步進,若相等,則找到第乙個。
找到第乙個後,現在距離為0,因為後面還可能再次出現y,那麼,分析可知,如果後面有y出現,最近的位置應該是當前位置+2,這樣才能滿足距離為1,即y,y-1,y;於是我們找到y後,從y+2處進行新的查詢,一直到找完整個陣列。
void findinarray(const int *a, const int n, const int y)
else
}if (!is_find)
}
比如我們在這個序列4,3,2,1,0,-1,0,1,2,3,4,3,4,3,4,5中查詢3:
比較4和1,距離為1,所以比較4後乙個位置,剛好匹配,找到第乙個3;
然後從3後面2個距離開始找,為1,此時,3-1=2;再從1後面2個距離開始找,為-1,此時3- -1 = 4;於是從-1後面4個距離開始找,找到第二個3,然後以此類推~~
該演算法最壞的情況是什麼呢,是的,每次步進2,一直走完整個數列,比如43434343434中找4或者3,找3的時候先步進1然後每次步進2,所以最壞情況下需要比較月為n/2次,比原演算法少了一半。
codevs等差數列
題目描述 description 給定n 1 n 100 個數,從中找出盡可能多的數使得他們能夠組成乙個等差數列.求最長的等差數列的長度.輸入描述 input description 第一行是乙個整數n,接下來一行包括了n個數,每個數的絕對值不超過10000000.輸出描述 output descr...
網易等差數列
如果乙個數列s滿足對於所有的合法的i,都有s i 1 s i d,這裡的d也可以是負數和零,我們就稱數列s為等差數列。小易現在有乙個長度為n的數列x,小易想把x變為乙個等差數列。小易允許在數列上做交換任意兩個位置的數值的操作,並且交換操作允許交換多次。但是有些數列通過交換還是不能變成等差數列,小易需...
演算法 等差數列
原理 如果乙個數列從第二項起,每一項與它的前一項的差等於同乙個常數,這個數列就叫做等差數列,這個常數叫做等差數列的公差,公差常用字母d表示。等差數列是常見數列的一種,如果乙個數列從第二項起,每一項與它的前一項的差等於同乙個常數,這個數列就叫做等差 數列,而這個常數叫做等差數列的公差,公差常用字母d表...