[計算機アルゴリズム]Ch.1アルゴリズムの第一歩
14246 ワード
사진을 클릭하면 PDF 정리본 다운로드 링크로 이어집니다.
🧐 アルゴリズム#アルゴリズム#
ステップ
与えられた
🧐 1.1最大数値の検索
に質問
トランプゲームで非常に簡単な最大の数字を見つけたいと思っています.10枚の札が地面に広げられている.
45, 60, 90, 75, 20, 55, 85, 35, 10, 25
最大の数字が書かれたカードを見つける方法の1つは、カードの数字を1つずつ比較しながら、この数字の中で最大の数字を覚えることです.最後のカードの数字を見た後、記憶の中で最大の数字が印刷されたカードを地面から1枚取った.👨🏻🔬
この方式をシーケンス検索と呼ぶ.
카드를 한 장씩 차례대로(주어진 순서대로) 읽어가며 찾는 방법이다.
👩🏻💻 意図コード表現なら?
Alg findMax(A)
input array A of size n
output integer max
1. max <- A[0]
2. for i <- 1 to n-1
if(A[i] > max)
max = A[i]
3. return max
🧐 1.2任意の数値の検索
に質問
特定の数字が書かれたカードを探してみてください.
45, 20, 60, 35, 10, 55, 90, 85, 75, 25
最大の数字を探すように、頭の中で数字を覚え、地面に展開されたカードを順番に読み、数字が書かれたカードを探す.👨🏻🔬
1.1の問題と同様に,順序探索を用いて解く方法である.
に質問
同じ10枚の札を昇順に並べておきます.順序探索よりも効果的な方法はありますか?
1枚の中間カードを読むと数字と比較し,1枚目のカードを読む順番探索よりも速くターゲットに近づく.
👨🏻🔬
この方式をバイナリ検索と呼ぶ.
昇順に並べられたデータを半分に分け、半分に分け、この過程を繰り返し、欲しいデータを探す探索アルゴリズム.
👩🏻💻 意図コード表現なら?
재귀 호출 방식
Alg binarySearchRecur(A[], left, right, key)
int mid;
static int count = 0;
if(left <= right)
{
count++;
mid = (left+right)/2;
if(key == A[mid])
return count;
else if(key < A[mid])
return binarySearchRecur(A, left, mid-1, key);
else
return binarySearchRecur(A, mid+1, right, key);
}
return 0;
반복 방식
Alg binarySearchIter(A[], left, right, key)
int mid, count = 0;
while(left <= right)
{
count++;
mid = (left+right)/2;
if(key == A[mid])
return count;
else if(key < A[mid])
right = mid - 1;
else
left = mid + 1;
}
return 0;
🧐 1.3おつり
に質問
買い物に小銭が必要コインの場合、最も少ないコインがほしい場合が多いです.どうすれば一番少ないコインを見つけることができますか?
残りのおつりの額を超えない前提で、最大額のコインを選択し続けてください.
👨🏻🔬
この方式をGreedyアルゴリズムと呼ぶ.詳細は4.1節で続きます.
🧐 1.4ブラシ
に質問
ある点から、すべての幹線道路を一度通って、起点に戻るが、軌跡を描くとき、鉛筆は紙から落ちることができない.何度も訪問してみてはいかがでしょうか.どのようにして絵を描く解決方法を見つけますか?
現在の点から始まる点から、現在の点を返すループを探します.
🧐 1.5迷宮を探す
に質問
誰も手伝ってくれなかったり、糸の塊がなかったりした場合、暗い迷宮から出られる方法は何ですか?
現在の位置で方向を選択し、右手を壁に置きます.そして出口が出るまで壁から離れずに歩きます.
🧐 1.6偽札を探す
に質問
多くのコインの山の中に偽のコインが挟まっている.偽札は目が見えず、普通の硬貨より軽い.両腕秤を使う回数を最小限に抑えるには、偽札を見つけるにはどうすればいいですか?
撤退する
1枚の硬貨を秤の左側に置き、残りの硬貨を1枚ずつ右側に置いて偽物を探します.
👨🏻🔬 哲洙はせいぜいn-1 n-1 n-1号秤と呼ぶ.
👩🏻💻 意図コード表現なら?
Alg cheolsu(A)
input array A of size n
output integer count
for i <- 1 to n-1
count++
if(A[0] != A[i])
return count
영희
2つのコインをペアにして、n/2 n/2 n/2ペアをそれぞれ秤に入れて偽札を探します.👨🏻🔬 英姫は最大n/2 n/2 n/2号秤を量る.
👩🏻💻 意図コード表現なら?
Alg younghui(A)
input array A of size n
output integer count
for(i = 0; i < n; i += 2)
count++
if(A[i] != A[i+1])
return count;
광수
コインの山を半分に分けて、秤の両側に置いて、もっと軽い面だけを半分に分けて、半分に分けて、秤の上に置き続けます.👨🏻🔬 光洙のアルゴリズムは運がいい時ではない.いつも最後に偽のコインを見つけているからだ.nnnコインがあるときは、いつもlog 2 nlog 2 nlog 2 n号秤に掛けて偽札を探します.
👩🏻💻 意図コード表現なら?
Alg kwangsu(A, left, right)
input array A of size n, integer left, integer right
output integer count
1. while(left != right)
count++
mid = (left + right) / 2
if(sum(A, left, mid) < sum(A, mid + 1, right))
right = mid
else
left = mid + 1
2. return count
🧐 1.7有毒な酒場
に質問
nnnは1つの酒壇に肉眼では確認できない毒薬しかない.毒のある酒を少しだけ味わって、正確には1週間後に死ぬなら、犠牲者を最小限に抑えて、毒のある酒壇を見つけるにはどうすればいいのだろうか.
Hint! 입력의 크기가 아주 작을 때 문제의 답을 찾아보자.
各壇は二進数0で、各人は酒1を味わい、酒0を味しないで、壇と人をペアにします.ex) 단지1: 00 / 2: 01 / 3: 10 / 4: 11
👨🏻🔬
nn園区があれば、log 2 nlog 2 nlog 2 n人は上記の方法で味わうことができ、1週間後には必ず有毒な酒園区を見つけることができ、犠牲者は最低0人、最大log 2 nlog 2 nlog 2 n人である.
💡 サマリ
👋 シーヶンスサーチ
주어진 순서에 따라 차례로 탐색한다.
👋 バイナリサーチ정렬된 항목들에 대해서 중간에 있는 항목을 비교하여 그 결과에 따라 같으면 탐색을 마치고, 다르면 작은 항목들이 있는 부분 또는 큰 항목들이 있는 부분을 같은 방식으로 탐색한다.
👋 小銭の問題가장 액면이 높은 동전을 항상 선택(욕심내어 선택)한다. 그리디(Greedy) 알고리즘은 4장에서 다룬다.
👋 1つの問題.오일러 서킷(Euler Circuit) 문제와 같다. 알고리즘의 핵심은 현재 점에서 다음으로 이동 가능 한 점을 선택할 때에는 반드시 현재 점으로 돌아오는 사이클이 존재하여야 한다는 것이다.
👋 偽札をさがす동전 더미를 반으로 분할하여 저울에 달고, 가짜 동전이 있는 더미를 계속해서 반으로 나누어 저울에 단다. 이는 분할 정복(Divide-and-Con quer) 알고리즘의 일종이며, 분할 정복 알고리즘에 대해서는 3장에서 상세히 설명한다.
👋 有毒な酒壇問題2진수를 활용하여 그 해를 찾는다.
Reference
この問題について([計算機アルゴリズム]Ch.1アルゴリズムの第一歩), 我々は、より多くの情報をここで見つけました https://velog.io/@gangjjang5/컴퓨터알고리즘-Ch.1-알고리즘의-첫걸음テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol