Greedy アルゴリズムとその C++ での実装
貪欲アルゴリズムは一般的に使用されるアルゴリズムのアイデアであり、多くの問題で広く使用されています。中心的な考え方は、各ステップで意思決定を行う際に、長期的な影響を考慮せず、当面の最適なソリューションのみを考慮することです。
C では、貪欲アルゴリズムの実装には、ソートやデータ処理などの基本的な操作が含まれることがよくあります。以下では、いくつかの典型的な問題に対する貪欲アルゴリズムの考え方と C での実装を紹介します。
1. アクティビティのスケジュール設定の問題
一連のアクティビティがある場合、各アクティビティには開始時間と終了時間があり、人は一度に 1 つのアクティビティのみに参加できます。この人が最大限の数のアクティビティに参加できるようにアクティビティを手配する方法を尋ねます。
貪欲アルゴリズムの考え方は、まず各アクティビティを終了時間の昇順に並べ替え、次に最初のアクティビティから開始して、終了時間が最も早いアクティビティを最初に参加するアクティビティとして選択することです。 。次に、残りのアクティビティの中から現在のアクティビティと互換性のある終了時刻が最も早いアクティビティを選択し、次に参加するアクティビティとします。すべてのアクティビティのスケジュールが完了するまで、このプロセスを繰り返します。
次は C コードの実装です:
struct activity { int start; int end; } bool cmp(activity a, activity b) { return a.end < b.end; } int arrangeActivities(activity arr[], int n) { sort(arr, arr + n, cmp); int cnt = 1; int lastEnd = arr[0].end; for (int i = 1; i < n; i++) { if (arr[i].start >= lastEnd) { cnt++; lastEnd = arr[i].end; } } return cnt; }
2. ハフマン エンコードの問題
重みのセットが与えられると、それらは等しくない長さのバイナリ文字にエンコードされる必要があります。文字列を使用して、すべての値の合計のエンコード長が最小化されるようにします。
貪欲アルゴリズムの考え方は、最初に重みを昇順に並べ替え、各ステップで最小の重みを持つ 2 つのノードを選択して新しいノードに結合し、その重みを次のように定義することです。これら 2 つのノードの重みの合計。すべてのノードがルート ノードに結合されるまで、このプロセスを繰り返します。このルートノードに対応する二分木がハフマン木です。ハフマン木をたどるとき、左に歩くことは 0 を追加することを意味し、右に歩くことは 1 を追加することを意味します。このようにして、各重みの対応するエンコードを解決できます。
次は C コードの実装です:
struct Node { int weight; int parent, leftChild, rightChild; } bool cmp(Node a, Node b) { return a.weight < b.weight; } void buildHuffmanTree(Node arr[], int n) { // 初始化所有节点 for (int i = 0; i < n; i++) { arr[i].parent = -1; arr[i].leftChild = -1; arr[i].rightChild = -1; } // 构建哈夫曼树 for (int i = n; i < 2 * n - 1; i++) { int minIndex1 = -1, minIndex2 = -1; for (int j = 0; j < i; j++) { if (arr[j].parent == -1) { if (minIndex1 == -1) { minIndex1 = j; } else if (minIndex2 == -1) { minIndex2 = j; } else { if (arr[j].weight < arr[minIndex1].weight) { minIndex2 = minIndex1; minIndex1 = j; } else if (arr[j].weight < arr[minIndex2].weight) { minIndex2 = j; } } } } arr[minIndex1].parent = i; arr[minIndex2].parent = i; arr[i].leftChild = minIndex1; arr[i].rightChild = minIndex2; arr[i].weight = arr[minIndex1].weight + arr[minIndex2].weight; } } void findHuffmanCode(Node arr[], int n) { // 从叶节点开始遍历哈夫曼树 for (int i = 0; i < n; i++) { string code = ""; int currentNode = i; while (arr[currentNode].parent != -1) { int parent = arr[currentNode].parent; if (arr[parent].leftChild == currentNode) { code = "0" + code; } else { code = "1" + code; } currentNode = parent; } cout << code << endl; } }
3. コインのつり銭問題の解決
コインのセットの額面と、必要なつりの金額が与えられると、この金額を構成するために必要なコインの枚数を尋ねます。
貪欲なアルゴリズムの考え方は、まず額面の降順でコインを並べ替え、次に額面が最大のコインから始めて、選択ができなくなるまでコインを取り続けることです。 、すべての金額が集まるまで、額面の次に大きいコインを使用します。
次は C コードの実装です:
bool cmp(int a, int b) { return a > b; } int minCoinNum(int coins[], int n, int amount) { sort(coins, coins + n, cmp); int cnt = 0; for (int i = 0; i < n; i++) { if (amount >= coins[i]) { cnt += amount / coins[i]; amount -= coins[i] * (amount / coins[i]); } } return cnt; }
実際の開発プロセスでは、欲張りアルゴリズムは最適なソリューションではないことがよくありますが、そのシンプルさと効率性により広く使用されています。上記の 3 つの典型的な問題の紹介を通じて、読者は貪欲なアルゴリズムとその C での実装の概念をよりよく理解し、習得できると思います。
以上がGreedy アルゴリズムとその C++ での実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

エラーの原因とソリューションPECLを使用してDocker環境に拡張機能をインストールする場合、Docker環境を使用するときに、いくつかの頭痛に遭遇します...

C35の計算は、本質的に組み合わせ数学であり、5つの要素のうち3つから選択された組み合わせの数を表します。計算式はC53 = 5です! /(3! * 2!)。これは、ループで直接計算して効率を向上させ、オーバーフローを避けることができます。さらに、組み合わせの性質を理解し、効率的な計算方法をマスターすることは、確率統計、暗号化、アルゴリズム設計などの分野で多くの問題を解決するために重要です。

言語のマルチスレッドは、プログラムの効率を大幅に改善できます。 C言語でマルチスレッドを実装する4つの主な方法があります。独立したプロセスを作成します。独立して実行される複数のプロセスを作成します。各プロセスには独自のメモリスペースがあります。擬似マルチスレッド:同じメモリ空間を共有して交互に実行するプロセスで複数の実行ストリームを作成します。マルチスレッドライブラリ:pthreadsなどのマルチスレッドライブラリを使用して、スレッドを作成および管理し、リッチスレッド操作機能を提供します。 Coroutine:タスクを小さなサブタスクに分割し、順番に実行する軽量のマルチスレッド実装。

std :: uniqueは、コンテナ内の隣接する複製要素を削除し、最後まで動かし、最初の複製要素を指すイテレーターを返します。 STD ::距離は、2つの反復器間の距離、つまり、指す要素の数を計算します。これらの2つの機能は、コードを最適化して効率を改善するのに役立ちますが、隣接する複製要素をstd ::のみ取引するというような、注意すべき落とし穴もあります。 STD ::非ランダムアクセスイテレーターを扱う場合、距離は効率が低くなります。これらの機能とベストプラクティスを習得することにより、これら2つの機能の力を完全に活用できます。

C言語では、Snake命名法はコーディングスタイルの慣習であり、アンダースコアを使用して複数の単語を接続して可変名または関数名を形成して読みやすくします。編集と操作、長い命名、IDEサポートの問題、および歴史的な荷物を考慮する必要がありますが、それは影響しませんが。

CのRelease_Semaphore関数は、取得したセマフォをリリースするために使用され、他のスレッドまたはプロセスが共有リソースにアクセスできるようにします。セマフォのカウントを1増加し、ブロッキングスレッドが実行を継続できるようにします。

dev-c 4.9.9.2コンピレーションエラーとソリューションdev-c 4.9.9.2を使用してWindows 11システムでプログラムをコンパイルする場合、コンパイラレコードペインには次のエラーメッセージが表示されます。gcc.exe:internalerror:aborted(programcollect2)pleaseubmitafullbugreport.seeforintructions。最終的な「コンピレーションは成功しています」ですが、実際のプログラムは実行できず、エラーメッセージ「元のコードアーカイブはコンパイルできません」がポップアップします。これは通常、リンカーが収集されるためです
