• Tidak ada hasil yang ditemukan

臺北市立建國高級中學

N/A
N/A
Protected

Academic year: 2023

Membagikan "臺北市立建國高級中學"

Copied!
1
0
0

Teks penuh

(1)

演算法 與 資料結構 Algorithm and Data Structure

- Brief Introduction

演算法是什麼

教育部國語辭典:一套定義非常明確的程序或一組規則。如果依序執行,則可完成某一特定 工作或解決某一特定問題。

簡而言之:用程式解決問題

資料結構是什麼

教育部國語辭典:呃……他沒有。

簡而言之:儲存、處理資料的結構,用以幫助解決問題、幫助算法達到特定時間複雜度。

一些基本演算法 Basic algorithms

數學相關Math Related

‧因式分解、找質數 Factors and Primes

‧大數運算、高精準運算 High Arithmetic

‧組合計數 Combination

‧計算幾何 Computation Geometry 分而治之(遞迴)Recursion

‧排序與搜索 Sort and Search

‧族繁不及備載

動態規劃Dynamic Programming

‧族繁不及備載

貪婪法Greedy Method

‧工作處理問題Job Processing

‧族繁不及備載

圖論Graph Algorithms

‧盲目搜索Blind Search:BFS, DFS, DFSID…

‧啟發式搜索Heuristic Search:A*, IDA*…

‧強連通、雙連通Strongly Connected Components, Biconnected Components

‧最小生成樹Minimum Spanning Tree

‧最短路徑Shortest Paths

‧最大網路流Maximum Flow

一些資料結構 Data Structures

‧堆疊、佇列 Stack and Queue

‧樹 Trees (Binary Tree, Tournament Tree, Balanced Tree……族繁不及備載)

‧堆Heap

‧獨立集Disjoint Set

建中資訊培訓講義 (一) - by kelvin

(2)

‧雜湊(或哈希法)Hash Table

一些問題 Some Problems that require some Thinking

用所謂的「基本」演算法和資料結構,來解決問題?

p.s. 以下題目大多都頗不容易(但都挺好玩的),不過展現了演算法到底能解決什麼問題。

故想不出來不用灰心。若有興趣,就茶餘飯後想想吧!

題目一 (ACM10810 – Ultra-Quick Sort)

給定n個兩兩相異的整數(n<=500,000),每次可以把兩個相鄰的數交換 試問至少要做幾次交換,才能把這n個整數由小到大排好?

題目二 (ACM10453 – Make Palindrome)

給定一個字串,每次「操作」可以修改一個字元,或增加一個字元 試問至少要幾次操作,才能把這個字串變成一個迴文(palindrome)?

題目三 (ACM 11269 – Setting Problems)

有兩個機器要處理n項工作,且每項工作要先經過機器一處理再交給機器二處理才完成。

對於每項工作i,機器一的處理時間T1i,機器二的處理時間為T2i。 試問至少要多少時間才能處理完這n項工作?

題目四

在一個7*7的表格中,填入1到49的數字各一次。

問有幾種填法,使得每個格子中的數字,都比他上方和左方的數字大?

題目五 (ACM 10985 – Rings ‘n’ Ropes)

有n個環(n<=100),這些環之間有些用了繩子連接。

給定繩子連接的情形(誰和誰連接、長度為多少)

試問:以哪兩個環當兩端盡量拉直時,繃緊時兩環之間的的長度最大?

題目六 (ACM529) (TOI2006初選, Prob.3) 有個數列S,共有n項(n<=1000)。

其中對於每個Si,都可以找到j,k<i(j,k可以相同),使得Si=Sj+Sk

現在假設告訴你S數列中有一個數為x,試問,S至少有幾項(即n最小是多少)?

題目七

給定兩個1到n的重排(n<=100,000)。(重排的意思,就是指把1到n這n個數任意排列)

試問這兩個重排中,其最長共同子字串長度為多少?

題目八 (ACM 11129 – An arithmetic permutation)

給定n,請給出一個1~n的重排P,使得不存在任何i<j<k,使Pi,Pj,Pk是等差數列。

題目九 (IOI2007 practice session, fish)

直線上有n個城市(n<=100,000),座標依序為x1,x2…,xn,每個城市i有漁獲量Fi

建中資訊培訓講義 (一) - by kelvin

(3)

若把漁獲從城市i運到城市j,運達時所運漁獲會損失|xi-xj|,<0則沒有漁獲運達城市j。

現在希望經過分配讓所有城市有相同的漁獲F,試問F最大能是多少?

不過……

如果你覺得上面的題目很困難,別太擔心;

如果你覺得上面的題目很好玩,別太高興……

因為基本上北市賽並不會這麼困難

北市賽最重要的技巧就是:Brute Force,所謂暴力法是也

上面只是告訴你,其實演算法很好玩,現在請先忍著點,以後慢慢就會碰到好玩的題目了:p

基本上,還是建議基本的題目和這種「好玩的題目」都可以寫寫。

寫基本的題目是為了「練基本功」,也就是把基礎的常用演算法用熟,想要用時就寫得出來。

至於「好玩的題目」,既然是好玩當然要寫啦,除此以外也可以順便活絡一下自己的思考。

總之,雖然北市賽基本上就是暴力暴力暴力,但為了長遠著想,這次還是會教一些比較進階 一點但很常用到的演算法。這次就從圖論和動態規劃開始吧!

在這之前先讓我們回到現實,來建立一點基礎知識吧。

一些觀念 Some Concepts

一般我們要用演算法解決的問題:

在有效的「時間」內,利用可運用的「空間」,「正確」地解決問題

所以,時間、空間、正確性,基本上就是目前會碰到的問題最重要的三要素XD。

時間複雜度

一個演算法的快慢,我們要如何估計呢?首先,我們知道電腦每秒可以做一定次數的運算,

所以我們可以用一個演算法對應一個輸入的運算次數來代表他的速度。

做簡單(並不很精確)的介紹,我們會用O(…)這樣的符號來描述一個演算法的快慢。

考慮一個輸入為n的演算法,如果他所需要的運算次數為F(n)次,則他的複雜度為O(F(n))。

但在描述時間複雜度時,由於如果n足夠大,F(n)中的常數項、低次項的影響相對小,所以 我們通常會省去常數項和低次項,只留下最高次、影響力最大的項目。比方說:

O(4n3+3n2+2n+1) => O(n3) O(16nlgn+5n+200) => O(nlgn) O(500) => O(1)

特別地,O(n)就是所謂的linear time線性時間,O(1)則是constant time常數時間。

當然,也有可能有比較複雜的時間複雜度出現,例如O(n2.376)、O(n4+2n)等等。

對於一般電腦來說,若F(n)<=107就是個十分可行的演算法。

可用空間

依題目條件計算。如16MB = 224bytes = 222integer  4106integer。

建中資訊培訓講義 (一) - by kelvin

(4)

[完]

建中資訊培訓講義 (一) - by kelvin

Referensi

Dokumen terkait

臺北市 111 學年度第一學期課程與教學工作圈教學推動組 國文學科平台「學習歷程檔案與命題設計」研習實施計畫 一、辦理依據:「臺北市普通高級中學課程與教學發展工作圈──課程與教 學推動組」國文學科平台 111學年度第一學期工作計畫 二、主辦單位:臺北市政府教育局 承辦單位:臺北市立第一女子高級中學臺北市國文學科平臺

結構化程式設計 所謂的結構化程式設計是指一個程式可以透過由上而下top-down的過程,將複雜的程式 分解成許多小單元如 C 語言中的函數,這些單元稱為模組Module,每個模組有各自的功 能。一個結構化的程式僅能有單一入口及單一出口,而 goto 跳躍指令易破壞結構,不應使用。 結構化程式設計的優點為:撰寫較容易、減少程式維護的時間和成本、提高程式的可讀性。