工作之后我們大部分的時間實在研究如何如何學習一門語言 如何如何掌握一門技術,但是作為編程的本質 數據結構和算法 我們慢慢的忽略了 。
工作后的很多程序員真的沒有大學生一樣的時間 去靜下心來去增加自己的底蘊,這是我深有體會的事情當然我這里指的是和我有累死感覺的人。
學習是一個過程,從簡入繁 一貫如此,記錄下來只為 記錄自己的點點滴滴。
算法的本質并不是我們程序員去創造算法 而是我們 按照先人創造的算法思想 用代碼來實現算法。
下面開始介紹兩個 簡單的例子 一個是交換 一個是最大公約數算法。
**簡單的交換**
~~~
#include "stdafx.h"
#include <stdio.h>
/*
我們的目標是
交換abcd的值為bcda 函數 M1 M2
此處代碼相信都是再小兒科不過的代碼了,但是小兒科的代碼實際上也是有小兒科的寫法。
我們在寫代碼的時候要保證的兩點 高效 快速 最小的損耗 完成功能即可 。
*/
int a = 1, b = 2, c = 3, d = 4;
int arr[4] = { 1, 2, 3, 4 };
//abcd的值變成 bcda
#define M1(ta,tb,tc,td) \
int tem; tem=td ; td=ta;ta=tb;tb=tc;tc=tem
//abcd的值變成 bcda
#define M2(ta,tb,tc,td) \
ta+=td;td=ta-td;ta-=td; \
ta+=tc;tc=ta-tc;ta-=tc; \
ta+=tb;tb=ta-tb;ta-=tb;
#define RESET(ta,tb,tc,td) \
ta = 1; tb = 2; tc = 3; td = 4;
int _tmain(int argc, _TCHAR* argv[])
{
//首先對abcd進行值替換成bcda 一說到替換 很多新手就想到了 t=a a=b b=t~
//這里中間多一步 空間的 浪費 即 t中間變量 實際上我們可以 a=a+b; b=a-b; a=a-b;
//我們可以這樣去寫這個代碼
printf("M2----abcd的值:%d,%d,%d,%d\n", a, b, c, d);
M2(a, b, c, d);
printf("M2----abcd的值:%d,%d,%d,%d\n", a, b, c, d);
printf("\n");
RESET(a, b, c, d);
//不同的情況下我們使用不同的方式 來解決 ,對于兩個變量的交換我們可以用上述的 無中間變量的方式來交換看似減少了空間占用 ,但是四個變量呢 ?四個變量的交換 貌似情況變了
//實現如M1 盡管我實現的不好 但是的確是減少了 傳統意義上的交換步驟 這種代碼其實只有在大家 剛接觸程序的時候才會寫道~~~~哈哈
//這也印證了一點 情況復雜多變 代碼實現方式也很多 我們要做到 最少的代碼 最少的計算次數 完成目的即可。
printf("M1----abcd的值:%d,%d,%d,%d\n", a, b, c, d);
M1(a, b, c, d);
printf("M1----abcd的值:%d,%d,%d,%d\n", a, b, c, d);
return 0;
}
~~~
**下面一個是 求最大公約數的算法 歐幾里得算法**
~~~
#include "stdafx.h"
//求最大公約數
//算法歐幾里得算法的應用
//獲得最大公約數
//現在求ab的最大公約數 既能被a又能被b整除的數字
//如果你不了解 歐幾里得算法 那么可能會 循環來解決問題 ...那么很糟糕的
//我們程序員的算法本質 是 拿來數學算法 思想轉換成代碼 這就是我們大部分使用算法的本質 除非你是算法研究者 那么 另當別論
//看看這端程序如果你不知道 歐幾里得算法 衍生的 求最大公約數算法 你該如何去寫程序?或許是多個循環吧,~
int GreatestCommonDivision(int a, int b)
{
//不能為負數
if (a < 0 || b < 0)
return -1;
///保證a一定大于等于b
if (a < b)
{
a = a + b;
b = a - b;
a = a - b;
}
int r = 0;
//取余數 如果余數等于0 那么 最大公約數既為 當前a
while ((r = a%b) != 0)
{
//否則 a<-b b<-r 這里的余數r 一定是小于b的
a = b;
b = r;
}
//等于0就退出了
return b;
}
int _tmain(int argc, char**argv)
{
int a = 15, b = 220;
printf("%d和%d的最大公約數是:%d\n", a, b, GreatestCommonDivision(a, b));
return 0;
}
~~~
簡單的入門就到這里 ,皮毛技術慢慢的積累 總有一天會有收獲滴
- 前言
- C++數據結構與算法------------二叉樹的2種創建
- 二叉樹的創建以及利用迭代實現中序、先序、后序遍歷、清空
- 數據結構-----哈夫曼樹的構造以及遍歷
- 二叉搜索樹的非遞歸創建和搜索
- 二叉搜索樹非遞歸方式刪除節點
- Lua中table內建排序與C/C++/Java/php/等內排序算法的排序效率比較
- 內嵌匯編與C/C++實現的冒泡排序,快速排序算法排序500W個數據對比
- 菜鳥學算法--簡單的交換和最大公約數算法入門篇
- 菜鳥學算法----改進后的歐幾里得算法
- C++實現一個線程安全的單例工廠
- 關于有序二維矩陣查找和字符串替換的兩道算法題
- 算法有序數組合并---在空間足夠的情況下,進行O(n)的合并 并且移動次數最小