演算法交作業之開篇 一

2021-06-28 18:55:15 字數 3588 閱讀 5272

首先解釋下標題的含義:
開篇:

今天這篇博文是關於陣列查詢的,很簡單。

演算法是計算機的生命。沒有演算法,就沒有軟體,計算機也就成了乙個冰冷的機器,沒有什麼實用價值。很多人認為,演算法是數學的內容,學起來特別麻煩。我們不能認為這種觀點是錯誤的。但是我們也知道,軟體是一種復合的技術,如果乙個人只知道演算法,但是不能用程式語言很好地實現,那麼再優秀的演算法也不能發揮作用。乙個人只有有了很好的計算機知識和數學知識,才能在演算法的學習上不斷進步。不管演算法都麼簡單,都要自己親手實踐,只有不斷認識錯誤、不斷發現錯誤,才能不斷提高自己的程式設計能力,不斷提高自己的業務水平。

這裡取名一步一步寫演算法的目的主要有兩個:第一,保證我們的演算法都是大家可以學得會,看的懂的;第二,保證我們的演算法是健壯的、可以測試的。所以在編寫的過程中,我們的演算法開發過程是伴隨著測試用例增加的,沒有測試用例保證的**只是一段無序的字元而已,沒有什麼價值。

其實任何演算法都有自己的應用環境和應用場景,沒有演算法可以適用於所有的場景。這一點希望大家明白。同時,我們也要清楚複雜的演算法都是由普通的演算法構成的,沒有普通的演算法就沒有複雜的演算法可言,所以複雜變簡單,由大化小,這就是演算法分治遞迴的基本思想。

上面的內容我感覺寫的比較好,所以搬運了。下面正式實現自己的版本。

1.陣列查詢函式1.0版本:

int find_array(int arr, unsigned length, const

int& value)

測試:#include

#include

//存在返回下標,否則返回-1表示查詢失敗。

int find_array(int arr, unsigned length, const

int& value)

static

void test1();

assert(find_array(nullptr, 10, 1)==-1);

assert(find_array(arr, 0, 1) == -1);

}int main()

通過測試可以看出程式的不健壯,需要對入口進行修改。

2.0版本:

int find_array(int arr, unsigned length, const

int& value)

//可以看到我們對入口限制。

3.0版本:

int find_array(int arr, std::size_t length, const int& value)

return -1;

}static void test1();

assert(find_array(nullptr, 10, 1)==-1);

assert(find_array(arr, 10, 1) == 0);

}

4.0優化版本:

1)用指標進行優化:

int find_array(int arr, std::size_t length, const int& value)

return -1;

}

2)對形參進行優化:

using

array = int(&)[10];//陣列型別的引用。

int find_array(array arr, const

int& value)

----------

c++ 11:

using

array = int(&)[10];//陣列型別的引用。

int find_array(array arr, const

int& value)

return -1;

}void test();

assert(find_array(arr, 10) == -1);

assert(find_array(arr, 2) == 1);

}//我們省略了陣列大小的引數,不過上面的寫法存在一定的侷限性。

----------

3)模版函式版本:

template

int find_array(const t* const &arr, const

std::size_t length, const t& value)

void test();

assert(find_array(arr, 10,1) ==0);

assert(find_array(arr, 10,3) == -1);

}

相關說明:

1.為什麼用size_t?避免陣列長度小於0.

2.引數的優化:盡量用const引用進行優化,錙銖必較。

3.測試平台:vs 2013+win 7.

二次優化版本:

最近學了點標準庫的內容,所以用向量和標準版定義的array 型別實現下。

#include 

#include

#include

#include

//存在返回下標,否則返回-1表示查詢失敗。

//vector 版本。

int find_array(const

std::vector

& ivec, const

int& value)

void test1();

assert(find_array(ivec,2)== 1);

assert(find_array(ivec, 10) == -1);

assert(find_array(std::vector

(), 10) == -1);

}//標準庫的陣列版本。

int find_array(const

std::array

& arr, const

int& value)

return -1;

}void test2();

assert(find_array(arr, 2) == 1);

assert(find_array(arr, 10) == -1);

assert(find_array(std::array

(), 10) == -1);

}int main()

----------

//來個可變引數列表試試。

int find_array(const

std::initializer_list& i1, const

int& value)

void test3(), 1) == 0);

assert(find_array(std::initializer_list(), 10) == -1);

}

summary:

演算法上路之開篇

題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1...

共識演算法之開篇

初識共識演算法,還是在關注位元幣的時候。共識演算法是區塊鏈的核心,因此想要真正弄懂什麼是區塊鏈,首先就要理解什麼是共識演算法,為什麼要用共識演算法。共識演算法並不是伴隨著位元幣的產生而出現的。早在 1997年 adam back 就設計出了hashcash,可以認為是工作量證明的雛形,最初是為了預防...

一步一步寫演算法(之開篇)

演算法是計算機的生命。沒有演算法,就沒有軟體,計算機也就成了乙個冰冷的機器,沒有什麼實用價值。很多人認為,演算法是數學的內容,學起來特別麻煩。我們不能認為這種觀點是錯誤的。但是我們也知道,軟體是一種復合的技術,如果乙個人只知道演算法,但是不能用程式語言很好地實現,那麼再優秀的演算法也不能發揮作用。乙...