---
# System prepended metadata

title: Algorithm 4/e (0)

---

# 演算法
通常是設計一段程序(邏輯)，實現既有的***方法***去解決***特定問題***。其與你使用的程式語言無關，是一種方法論，演算法是用來描述一種有限、確定、有效且合適用程式語言解決問題的方法。 (P1.) 例如最大公約數 gcd所使用的歐基里德算法。

對於我們關注的大多演算法都必須適當的組織資料，而為了更有效率的使用特定資料集合，**資料結構**議題因應而生，且資料結構通常與演算法息息相關。

學習演算法可以提升效率、節省資源，甚至可以完成很多想像上不可能完成的任務。無論在什麼領域上，精心設計的演算法都是解決大型問題最有效的方式。

實踐基礎算法是重要的，這過程有助於我們去學習外部庫裡所使用的更高階版本的原型。
另外也因我們有系統的學習過演算法，在全新的開發環境之下我們可以更快速的將其應用出來，解決我們預計會面臨的系統問題。

為一個任務(問題)選擇合適的算法是困難的，因此計算機領域有一專業學門稱之為**算法分析** 可以幫助我們，比較不同演算法的性能差異以及其期望的效能。



## 基礎程式設計模式 
基礎 Java構造:
* 原始數據類型(primitive): 
    ```java
    long(8) double(8) float(4) int(4)        
    short(2) char(2) byte(1) boolean(1)
    //單位 byte
    ```


    高精度計算的場景（例如金融或貨幣計算）中，應該避免使用 float 和 double，浮點數表示法遵循 IEEE 754 標準，尾數的位數（float 是 23 位，double 是 52 位）是有限的，當無法用有限位數的二進制來精確表示一個十進制小數時，就會出現截斷，從而造成精度遺失。
        
    ```java
    double a = 0.1;
    double b = 0.2;
    // a+b=?? 0.30000000000000004
    ```     
* 語句 (Statment): 是程式的基本執行單元。可以將其視為程式碼中的「指令」。
    宣告、賦值、條件、迴圈、呼叫(方法)、返回

* 陣列(數組)(Array): 陣列是多個同種數據類型的值的集合。
    同質性 (Homogeneity)、固定大小 (Fixed Size)、索引 (Index)、初始化與存取。

* 靜態方法(Static Methods): 
    不需要建立這個類別的物件 (object) 就能直接呼叫它。靜態的概念，指的是此方法或是成員屬於 Class而非物件，靜態方法會儲存在方法區。它不與任何特定的物件相關聯，所以不需要 this 引用。當你呼叫一個靜態方法時，JVM 會直接找到方法區中的那段代碼並執行。靜態成員亦儲存在方法區，只有一份，被所有物件共用。
    
* 字串 (Strings)
    字串是 Java 中一個非常重要的引用數據類型，用於表示一連串的字元。雖然它們不是原始數據類型，但由於其常用性，Java 對它們提供了很多便利的操作。不可變性 (Immutability)：這是字串的一個關鍵特性。一旦建立，字串的內容就不能被改變。所有修改字串的操作，例如 concat()，都會返回一個新的字串物件。字串池 (String Pool)是JAVA為了優化效能，當你使用字串常數 (literal) 宣告字串時，JVM 會在一個稱為「字串池」的特殊記憶體區域中尋找是否已經存在相同內容的字串。
    ```java
    String s1 = "hello";  // 創建字串 "hello" 並放入字串池
    String s2 = "hello";  // s2 直接引用字串池中已有的 "hello"
    System.out.println(s1 == s2); // 輸出 true

    String s3 = new String("hello"); 
    //JVM 會強制在堆上建立一個新的物件，不會檢查字串池。

    System.out.println(s1 == s3);// 輸出 false
    ```    

* 標準輸入/輸出( STDIN/STDOUT)
    是程式與外界溝通的基本方式，就像是程式與使用者互動的橋樑。
    ```java
    System.out.println("Hello"); //列印字串後換行。

    /**
     * 透過Scanner獲取 STDIN，System.in就是標準輸入的代表。
     **/
    Scanner scanner = new Scanner(System.in);
    ```

* 數據抽象(Data Abstraction):
    數據抽象是物件導向編程 (OOP) 的核心概念之一。它允許我們將資料 (屬性) 和處理這些資料的方法 (行為) 封裝在一起，形成一個獨立的單元，也就是類別 (Class)。進而使的我們不需要依賴原始數據類型，發展出更適用的資料結構。
    
[NEXT](https://hackmd.io/Nbw1-2KPRr2VlNwmo9VfgA)