對數器是通過用大量測試資料來驗證演算法是否正確的一種方式對數器需要兩樣東西:
看到這裡,有些童鞋有疑問了。既然我們知道了絕對正確的方法,直接用這個方法不就好了嘛?
而在對數器中,我們要求的絕對正確的演算法是沒有時間和空間複雜度的限制的,唯一的要求是確保絕對正確。因為只有絕對正確,我們才能通過樣例的比對,發現我們的**是在**出了錯誤。
【使用步驟】
有乙個你想要測的方法a
;
實現乙個絕對正確但是複雜度不好的方法b
;
實現乙個隨機樣本產生器;
實現對比演算法a
和b
的方法;
把方法a
和方法b
比對多次來驗證方法a
是否正確;
如果有乙個樣本使得比對出錯,列印樣本分析是哪個方法出錯;
當樣本數量很多時比對測試依然正確,可以確定方法a
已經正確。
其中要注意以下幾點:
【示例】
這裡使用氣泡排序進行演示
/*** 氣泡排序的對數器 */
public
class
bubblesort
for (int end = arr.length - 1; end > 0; end--) }}
}public
static
void swap(int arr, int i, int
j)
/*** 2.實現乙個絕對正確,可以複雜度不是很好的方法b
* 可以直接用一些庫函式來進行測試
*/public
static
void rightmethod(int
arr)
/*** 3.實現乙個隨機樣本產生器
*/public
static
int generaterandomarray(int size, int
value)
return
arr;
}/*** 4.實現比對的方法
* 判斷兩個陣列是否相等
*/public
static
boolean isequal(int arr1, int
arr2)
if (arr1 == null && arr2 == null
)
if (arr1.length !=arr2.length)
for (int i = 0; i < arr1.length; i++)
}return
true
; }
public
static
void printarray(int
arr)
for (int i = 0; i < arr.length; i++)
system.out.println();
}public
static
int copyarray(int
arr)
int res = new
int[arr.length];
for (int i = 0; i < arr.length; i++)
return
res;
}public
static
void
main(string args)
}system.out.println(succeed ? "nice!" : "error----");
int arr =generaterandomarray(size, value);
printarray(arr);
bubblesort(arr);
printarray(arr);
}}
【小提示】
很多童鞋進行筆試前,都是背一些記在小本本上的**,然後匆匆上陣。寫出的演算法的正確性完全靠oj的判斷,當程式卡在乙個2000行的陣列樣例處出現錯誤時,就完全傻了......這t喵叫我怎麼去進行除錯分析啊。而有對數器的小夥伴就不一樣了,由於使用的都是小樣本,出現錯誤時也方面進行分析。而且進行了多次測試,確保覆蓋了所有的特殊情況。因此筆試前我們可以準備一些對數器模版,如陣列排序的對數器,鍊錶的對數器等等。
參考:
排序對數器
其實可以不用sort檢驗,排序的特點就是前乙個數比後乙個小 或大 嘛,不過完全無所謂,用這個現成的就行。include include include include include includeusing namespace std define testtime 5000 測試輪數 defin...
對數器是什麼
對數器可以說是驗證演算法是否正確的一種方式。尤其是在筆試的時候,用貪心演算法寫出的程式,暫時無法用數學公式嚴格推導證明,只能通過大量的資料集驗證演算法的正確性。而大量的資料集當中要包括各種情況,各個方面都要考慮到,對我們自己來說,有時會考慮不周,而且又是在時間緊迫的情況下。所以對數器就派上了用場。對...
選擇排序和對數器
演算法的過程描述如下 arr 0 n 1 範圍上,找到最小值所在的位置,然後把最小值交換到0位置。arr 1 n 1 範圍上,找到最小值所在的位置,然後把最小值交換到1位置。arr 2 n 1 範圍上,找到最小值所在的位置,然後把最小值交換到2位置。arr n 1 n 1 範圍上,找到最小值位置,然...