国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

算法筆試?yán)?-對數(shù)器的使用

wyk1184 / 854人閱讀

摘要:對于一個(gè)數(shù)組的排序,如果筆試中要求的時(shí)間復(fù)雜度是,但是你卻寫了一個(gè)冒泡排序的算法交上去了,這時(shí)就會提示而在對數(shù)器中,我們要求的絕對正確的算法是沒有時(shí)間和空間復(fù)雜度的限制的,唯一的要求是確保絕對正確。

對數(shù)器的作用

對數(shù)器是通過用大量測試數(shù)據(jù)來驗(yàn)證算法是否正確的一種方式。在算法筆試的時(shí)候,我們經(jīng)常只能確定我們寫出的算法在邏輯上是大致正確的,但是誰也不能一次性保證絕對的正確。特別是對于一些復(fù)雜的題目,例如貪心算法,我們往往無法在有限時(shí)間內(nèi)用數(shù)學(xué)公式來推導(dǎo)證明我們程序的正確性。而且在線的OJ一般只會給出有數(shù)的幾個(gè)簡單的samples,可能我們的算法在這些簡單的samples偶然通過了,但是在一些復(fù)雜的samples處卻出現(xiàn)了問題。這時(shí)我們無法使用復(fù)雜的samples來分析調(diào)試我們的代碼,人工設(shè)計(jì)樣例來測試代碼的效率又太低,而且不能確保考慮各種特殊情況。因此,能隨機(jī)產(chǎn)生不同情況的數(shù)據(jù)的對數(shù)器就派上了用場。

對數(shù)器,簡而言之,就是一個(gè)絕對正確的方法和能產(chǎn)生大量隨機(jī)樣例的隨機(jī)器的組合。看到這里,有些童鞋有疑問了。既然我們知道了絕對正確的方法,直接用這個(gè)方法不就好了嘛?

請注意,算法追求的不是解決問題,而是高效率的解決問題。對于一個(gè)數(shù)組的排序,如果筆試中要求的時(shí)間復(fù)雜度是$O(NlogN)$$,但是你卻寫了一個(gè)冒泡排序的算法交上去了,這時(shí)OJ就會提示:

Time Limit Exceeded

而在對數(shù)器中,我們要求的絕對正確的算法是沒有時(shí)間和空間復(fù)雜度的限制的,唯一的要求是確保絕對正確。因?yàn)橹挥薪^對正確,我們才能通過樣例的比對,發(fā)現(xiàn)我們的代碼是在哪里出了錯(cuò)誤。

相關(guān)概念

有一個(gè)你想要測的方法a

實(shí)現(xiàn)一個(gè)絕對正確但是復(fù)雜度不好的方法b

實(shí)現(xiàn)一個(gè)隨機(jī)樣本產(chǎn)生器;

實(shí)現(xiàn)對比算法ab的方法;

把方法a和方法b比對多次來驗(yàn)證方法a是否正確;

如果有一個(gè)樣本使得比對出錯(cuò),打印樣本分析是哪個(gè)方法出錯(cuò);

當(dāng)樣本數(shù)量很多時(shí)比對測試依然正確,可以確定方法a已經(jīng)正確。

其中要注意以下幾點(diǎn):

隨機(jī)產(chǎn)生的樣本應(yīng)該是小數(shù)據(jù)集,但是要進(jìn)行多次(10w+)的對比。小數(shù)據(jù)集是因?yàn)榉奖銓Ρ确治觯啻伪葘κ且采w所有的隨機(jī)情況。

算法b要保持正確性。

示例

冒泡排序的對數(shù)器:

要測的方法

public static void bubbleSort(int[] arr)
{
    if (arr==null || arr.length < 2)
        return;
    for (int end = arr.length - 1;end>0; end--)
    {
        for (int i = 0; i < end; i++)
        {
            if (arr[i] > arr[i+1])
                swap(arr, i, i+1);
        }
    }
}

實(shí)現(xiàn)一個(gè)絕對正確,可以復(fù)雜度不是很好的方法b

// 可以直接用一些庫函數(shù)來進(jìn)行測試
public static void rightMethod(int[] arr)
{
    Arrays.sort(arr);
}

實(shí)現(xiàn)一個(gè)隨機(jī)樣本產(chǎn)生器

// 隨機(jī)數(shù)生成器
public static int[] generateRandomArray(int size, int value)
{
//Math.random() -> double [0,1)
//(int) ((size + 1) * Math.random()) -> [0,size]整數(shù)
// 生成長度隨機(jī)[0, size]的數(shù)組
int[] arr = new int[(int) ((size+1) * Math.random())];
for (int i = 0; i < arr.length; i++)
{
    // 一個(gè)隨機(jī)數(shù)減去另一個(gè)隨機(jī)數(shù),生成[-value, value]的隨機(jī)數(shù)
    arr[i] = (int) ((value+1) * Math.random()) - (int) (value * Math.random());
}
return arr;
}

實(shí)現(xiàn)比對的方法

// 判斷兩個(gè)數(shù)組是否相等
public static boolean isEqual(int[] arr1, int[] arr2)
{
    if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null))
        return false;
    if (arr1 == null && arr2 == null)
        return true;
    if (arr1.length != arr2.length)
        return  false;
    for (int i = 0; i < arr1.length; i++)
    {
        if (arr1[i] != arr2[i])
            return false;
    }
    return true;
}

將方法a和方法b進(jìn)行多次的比對

如果有一個(gè)樣本使得本次比對出錯(cuò),則打印該樣本,分析方法錯(cuò)在哪里

當(dāng)樣本數(shù)量足夠多時(shí),比對測試依然正確,則可以確定我們寫的方法a是正確的

public static void main(String[] args) 
{
    int testTime = 500000;
    int size = 10;
    int value = 100;
    boolean succeed = true;
    for (int i = 0; i < testTime; i++)
    {
        int[] arr1 = generateRandomArray(size, value);
        int[] arr2 = copyArray(arr1);
        int[] arr3 = copyArray(arr1);
        bubbleSort(arr1);
        rightMethod(arr2);
        if (!isEqual(arr1, arr2))
        {
            succeed = false;
            printArray(arr3);
            break;
        }
    }
    System.out.println(succeed ? "Nice!" : "error----");
    int[] arr = generateRandomArray(size, value);
    printArray(arr);
    bubbleSort(arr);
    printArray(arr);

}

小提示

很多童鞋進(jìn)行筆試前,都是背一些記在小本本上的代碼,然后匆匆上陣。寫出的算法的正確性完全靠OJ的判斷,當(dāng)程序卡在一個(gè)2000行的數(shù)組樣例處出現(xiàn)錯(cuò)誤時(shí),就完全傻了......這T喵叫我怎么去進(jìn)行調(diào)試分析啊。而有對數(shù)器的小伙伴就不一樣了,由于使用的都是小樣本,出現(xiàn)錯(cuò)誤時(shí)也方面進(jìn)行分析。而且進(jìn)行了多次測試,確保覆蓋了所有的特殊情況。因此筆試前我們可以準(zhǔn)備一些對數(shù)器模版,如數(shù)組排序的對數(shù)器,鏈表的對數(shù)器等等。后續(xù)我也會更新一些對數(shù)器的模版,有java版本和python版本。

記住哦,offer都是留給有準(zhǔn)備的人~~

數(shù)組排序

Java版本

后續(xù)版本,陸續(xù)更新中.....

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72031.html

相關(guān)文章

  • 2019網(wǎng)易互娛數(shù)據(jù)挖掘?qū)嵙?xí)生筆試部分記錄

    摘要:今晚做完了網(wǎng)易互娛數(shù)據(jù)挖掘?qū)嵙?xí)生的筆試題,雖然大部分的題目都不太記得了。采樣分為上采樣和下采樣。上采樣是把小眾類復(fù)制多份下采樣是從大眾類中剔除一些樣本,或者說只從大眾類中選取部分樣本。 今晚做完了網(wǎng)易互娛數(shù)據(jù)挖掘?qū)嵙?xí)生的筆試題,雖然大部分的題目都不太記得了。但是還是有一些印象比較深的坑需要填一下。比起騰訊和字條跳動(dòng)難度適中,不算很大,字節(jié)的筆試掛了。其實(shí)這次感覺自己做的也不是挺好哈哈哈...

    Meils 評論0 收藏0
  • 令人拍案叫絕的Wasserstein GAN

    摘要:測度是高維空間中長度面積體積概念的拓廣,可以理解為超體積。前作其實(shí)已經(jīng)針對第二點(diǎn)提出了一個(gè)解決方案,就是對生成樣本和真實(shí)樣本加噪聲,直觀上說,使得原本的兩個(gè)低維流形彌散到整個(gè)高維空間,強(qiáng)行讓它們產(chǎn)生不可忽略的重疊。 在GAN的相關(guān)研究如火如荼甚至可以說是泛濫的今天,一篇新鮮出爐的arXiv論文《Wasserstein GAN》卻在Reddit的Machine Learning頻道火了,連Go...

    lieeps 評論0 收藏0
  • 【天贏金創(chuàng)】算法復(fù)雜度分析

    摘要:示例代碼斐波那契數(shù)列復(fù)制代碼復(fù)制代碼這里,給定規(guī)模,計(jì)算所需的時(shí)間為計(jì)算的時(shí)間和計(jì)算的時(shí)間的和。示例代碼復(fù)制代碼復(fù)制代碼同樣是斐波那契數(shù)列,我們使用數(shù)組來存儲計(jì)算結(jié)果,這樣算法復(fù)雜度優(yōu)化為。算法適用于少量數(shù)據(jù)的排序,時(shí)間復(fù)雜度為。 原文:http://www.cnblogs.com/gaochundong/p/complexity_of_algorithms.html為什么要進(jìn)行算法分...

    NikoManiac 評論0 收藏0
  • 回溯算法講解--適用于leetcode絕大多數(shù)回溯題目

    摘要:什么是回溯算法回溯法是一種系統(tǒng)搜索問題解空間的方法。解空間定義為與數(shù)字長度相同。最后,為什么要掌握回溯法因?yàn)槎嘶厮莘ㄖ蠊P試?yán)锏暮芏囝}就算不了,起碼成功運(yùn)行到之間是沒問題的。 什么是回溯算法?回溯法是一種系統(tǒng)搜索問題解空間的方法。為了實(shí)現(xiàn)回溯,需要給問題定義一個(gè)解空間。說到底它是一種搜索算法。只是這里的搜索是在一個(gè)叫做解空間的地方搜索。而往往所謂的dfs,bfs都是在圖或者樹這種數(shù)據(jù)...

    saucxs 評論0 收藏0

發(fā)表評論

0條評論

wyk1184

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<