# 演算法 通常是設計一段程序(邏輯),實現既有的***方法***去解決***特定問題***。其與你使用的程式語言無關,是一種方法論,演算法是用來描述一種有限、確定、有效且合適用程式語言解決問題的方法。 (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)