“程序=數(shù)據(jù)結(jié)構(gòu)+算法” 這個公式很多開發(fā)者都知道。
算法是對特定問題的求解步驟的一種精確描述方法,目前被廣泛認(rèn)可的算法專業(yè)定義是:算法是模型分析的一組可行的、確定的和 有窮的規(guī)則。
通俗的說,算法可以理解為一個完整的解題步驟,由一些基本運(yùn)算和規(guī)定的運(yùn)算 順序構(gòu)成。
在有限的時(shí)間內(nèi)通過解題步驟解決特定的問題來獲得有效的輸出結(jié)果。
是不是看著懵懵的?別急,技術(shù)需要慢慢消化
舉個例子吧,就用最經(jīng)典的例子就是統(tǒng)籌安排!
假如你有3件事(A B C)要做
A 需要5分鐘
B 需要5分鐘但是需要等會15分鐘 (如燒水過程)
C 需要10分鐘
你會怎么安排呢,歡迎留言,今天就到此為止(開玩笑啦)
我們來看兩張圖你就明白了
方法一
方法二
上述例子中我們看出來,算法分兩種:算法效率低和算法效率高。算法也是有好壞區(qū)分的。好的算法是提工作的效率,算法的基本任務(wù)是針對一個具體的問題找到一個高效率的處理方法才是我們想要的。
算法的特點(diǎn):有窮性、確切性、輸入、輸出和可行性
有窮性:算法指令或步驟執(zhí)行次數(shù)有限,執(zhí)行時(shí)間也許有限
確切性:算法的每一個指令或步驟必須有明確的定義或描述
輸入:一個算法應(yīng)該有相應(yīng)的輸入條件
輸出:一個算法應(yīng)該有相應(yīng)的輸出結(jié)果
可行性:算法的執(zhí)行步驟必須是可行的,且可以在有限的時(shí)間內(nèi)完成。
流程圖
流程圖是一種圖形表示算法的流程方法。
一般采用如下三種結(jié)構(gòu)。
順序結(jié)構(gòu):順序結(jié)構(gòu)是最簡單的流程結(jié)構(gòu),一個接著一個進(jìn)行處理。
分支結(jié)構(gòu):分支結(jié)構(gòu)常用于根據(jù)某個條件來決定算法的走向。如:先判斷p,p成立執(zhí)行B
不成立執(zhí)行A。分支結(jié)構(gòu)又是也成為條件結(jié)構(gòu)
循環(huán)結(jié)構(gòu):循環(huán)結(jié)構(gòu)常用于反復(fù)執(zhí)行,可分為當(dāng)型循環(huán)結(jié)構(gòu)和直到型循環(huán)結(jié)構(gòu)。
當(dāng)值循環(huán)結(jié)構(gòu)先對條件進(jìn)行判斷,在執(zhí)行,一般用while語句實(shí)現(xiàn)
直到型循環(huán)結(jié)構(gòu)先執(zhí)行,然后在對條件進(jìn)行判斷,一般用until、do...while語句執(zhí)行。
Ps:構(gòu)成死循環(huán)的結(jié)構(gòu)沒有如何意義。
算法性能評價(jià)。
時(shí)間復(fù)雜度:是同一問題可用不同算法解決,而一個算法的質(zhì)量優(yōu)劣將影響到算法乃至程序的效率。算法分析的目的在于選擇合適算法和改進(jìn)算法。
空間復(fù)雜度:時(shí)間復(fù)雜度是同一問題可用不同算法解決,而一個算法的質(zhì)量優(yōu)劣將影響到算法乃至程序的效率。算法分析的目的在于選擇合適算法和改進(jìn)算法。
下面代碼演示
在一個數(shù)組中查找數(shù)據(jù)是很常用的操作。
首先輸入待查找的數(shù)據(jù),并生成一個隨機(jī)的數(shù)據(jù)數(shù)組,然后從頭到尾對數(shù)據(jù)進(jìn)行逐個比較,當(dāng)數(shù)據(jù)相等時(shí)找到數(shù)據(jù),并輸出結(jié)果。
輸入一個沒有的值
輸入一個有的值。
代碼區(qū)域,便于復(fù)制
import java.util.Random;
import java.util.Scanner;
public class text {
static int n =20;
public static void main(String[] args) {
int [] arr=new int[n];
//x用戶保存鍵盤錄入的值
int x,N,i;
//f 保存找到的數(shù)據(jù)
int f=-1;
Random ran = new Random();
for(i=0;i<n;i++){
arr[i] =ran.nextInt(100); //產(chǎn)生數(shù)組 隨機(jī)生成種子
}
System.err.println('隨機(jī)生成的數(shù)據(jù)序列:\n');
for(i=0;i<n;i++){
System.out.println(arr[i]+' ');
}
System.out.println('\n\n');
System.out.println('輸入你要查找的整數(shù):');
//鍵盤錄入
Scanner input = new Scanner(System.in);
x=input.nextInt();//輸入查找的數(shù)
for(i=0;i<n;i++){ //順序查找
if(x==arr[i]){
f=i; //=找到數(shù)據(jù) 并賦值
break;
}
}
if(f<0){
System.out.println('沒有找到數(shù)據(jù):'+x);
}else{
System.out.println('數(shù)據(jù):'+x+'位于數(shù)組的第'+(f+1)+'個元素處。\n');
}
}
}