ホームページ バックエンド開発 Python チュートリアル Python でのヒープと優先キューの使用シナリオは何ですか?

Python でのヒープと優先キューの使用シナリオは何ですか?

Oct 28, 2023 am 08:56 AM
ヒープ 使用するシーン 優先キュー

Python でのヒープと優先キューの使用シナリオは何ですか?

Python におけるヒープと優先キューの使用シナリオは何ですか?

ヒープは、動的コレクションを効率的に維持するためによく使用される特別なバイナリ ツリー構造です。 Python の heapq モジュールはヒープ実装を提供し、ヒープ操作を簡単に実行できます。

プライオリティ キューも特別なデータ構造であり、通常のキューとは異なり、その各要素には優先度が関連付けられています。最も優先度の高い要素が最初に取り出されます。 Python の heapq モジュールでも優先キュー機能を実装できます。

以下では、ヒープと優先キューを使用する具体的なシナリオをいくつか紹介し、関連するコード例を示します。

  1. 上位 K 問題の検索
    最初の k 個の最大の数値または最初の k 個の最小の数値を解くなど、シーケンス内の最初の k 個の最大または最小の要素を解くことは一般的な問題です。 。この問題は、サイズ k のヒープまたは優先キューを使用して簡単に解決できます。
import heapq

def top_k_smallest(nums, k):
    heap = []
    for num in nums:
        heapq.heappush(heap, num)
        if len(heap) > k:
            heapq.heappop(heap)
    return heap

nums = [5, 3, 8, 2, 7, 1, 9]
k = 3
result = top_k_smallest(nums, k)
print(result)  # 输出 [3, 2, 1]
ログイン後にコピー
  1. 順序付き配列のマージ
    複数の順序付き数値をマージして順序付き配列を形成するのは一般的な問題です。これはプライオリティ キューを使用して実装でき、毎回各配列から最小の要素が取得されてプライオリティ キューに入れられ、キュー内の要素が順番に取り出されます。
import heapq

def merge_sorted_arrays(arrays):
    result = []
    pq = []
    for array in arrays:
        if array:
            heapq.heappush(pq, (array[0], array))
    
    while pq:
        smallest, array = heapq.heappop(pq)
        result.append(smallest)
        if array[1:]:
            heapq.heappush(pq, (array[1], array[1:]))
    
    return result

arrays = [[1, 3, 5], [2, 4, 6], [0, 7, 8]]
result = merge_sorted_arrays(arrays)
print(result)  # 输出 [0, 1, 2, 3, 4, 5, 6, 7, 8]
ログイン後にコピー
  1. 中央値の検索
    シーケンスの中央値の検索は古典的な問題です。これは、シーケンスの前半に最大ヒープ、シーケンスの後半に最小ヒープの 2 つのヒープを使用して実現できます。 2 つのヒープのサイズを等しいか 1 だけ異なるように保つと、ヒープの上部で中央値を取得できます。
import heapq

def median(nums):
    min_heap = []
    max_heap = []
    for num in nums:
        if len(max_heap) == 0 or num <= -max_heap[0]:
            heapq.heappush(max_heap, -num)
        else:
            heapq.heappush(min_heap, num)
        
        if len(max_heap) > len(min_heap) + 1:
            heapq.heappush(min_heap, -heapq.heappop(max_heap))
        elif len(min_heap) > len(max_heap):
            heapq.heappush(max_heap, -heapq.heappop(min_heap))
    
    if len(max_heap) > len(min_heap):
        return -max_heap[0]
    elif len(min_heap) > len(max_heap):
        return min_heap[0]
    else:
        return (-max_heap[0] + min_heap[0]) / 2

nums = [4, 2, 5, 7, 1, 8, 3, 6]
result = median(nums)
print(result)  # 输出 4.5
ログイン後にコピー

上記は、Python でのヒープと優先キューの一般的な使用シナリオとサンプル コードです。ヒープと優先キューは一般的に使用されるデータ構造の一部であり、それらの使用法を習得することは、いくつかの複雑な問題を解決するのに非常に役立ちます。

以上がPython でのヒープと優先キューの使用シナリオは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Redis と MongoDB の違いと使用シナリオ Redis と MongoDB の違いと使用シナリオ May 11, 2023 am 08:22 AM

Redis と MongoDB はどちらも人気のあるオープンソース NoSQL データベースですが、設計概念と使用シナリオが異なります。この記事では、Redis と MongoDB の違いと使用シナリオに焦点を当てます。 Redis と MongoDB の概要 Redis は、キャッシュおよびメッセージ ミドルウェアとしてよく使用される高性能データ ストレージ システムです。 Redis はメモリを主記憶媒体として使用しますが、ディスクへのデータの永続化もサポートします。 Redis は、さまざまなデータ構造 (たとえば、

Redis と Elasticsearch の違いと使用シナリオ Redis と Elasticsearch の違いと使用シナリオ May 11, 2023 am 08:01 AM

Redis と Elasticsearch の違いと使用シナリオ インターネット情報の急速な発展と大量の定量化に伴い、データの効率的な保存と取得がますます重要になってきています。このため、NoSQL (NotOnlySQL) タイプのデータベースが登場しており、その中でも Redis と Elasticsearch の方が人気があります。この記事では、Redis と Elasticsearch を比較し、その使用シナリオを検討します。 Redis と Elasticsearch

Redisにおけるプライオリティキュー実装の詳細説明 Redisにおけるプライオリティキュー実装の詳細説明 Jun 20, 2023 am 08:31 AM

Redis の優先キューの実装の詳細な説明 優先キューは、キューの操作中に要素を特定のルールに従って並べ替え、その順序を維持できる一般的なデータ構造です。これにより、キューから取り出された要素は常に事前に設定された優先順位に従います。インメモリ データベースである Redis には、高速かつ効率的なデータ アクセス機能があるため、優先キューの実装にも利点があります。この記事では、Redis を使ってプライオリティキューを実装する方法と応用について詳しく紹介します。 1. Redis実装の基本原則 Redisによるプライオリティキュー実装の基本原則

ヒープとスタックの違いは何ですか ヒープとスタックの違いは何ですか Nov 22, 2022 pm 04:12 PM

相違点: 1. ヒープ領域は通常、プログラマによって割り当ておよび解放されますが、スタック領域はオペレーティング システムによって自動的に割り当ておよび解放されます。 2. ヒープは 2 次キャッシュに格納され、ライフ サイクルは仮想マシンのガベージ コレクション アルゴリズムによって決定されますが、スタックは 1 次キャッシュを使用します。このキャッシュは、通常、呼び出されたときにストレージ領域にあります。 、通話が完了するとすぐに解放されます。 3. データ構造が異なります。ヒープはツリーとみなすことができますが、スタックは先入れ後出しのデータ構造です。

Python での Deque: 効率的なキューとスタックの実装 Python での Deque: 効率的なキューとスタックの実装 Apr 12, 2023 pm 09:46 PM

Python の deque は、コンピューティングにおいて最も一般的なリストベースのデータ型である、エレガントで効率的な Python のキューとスタックの実装に役立つ、低レベルの高度に最適化された deque です。この記事では、Yun Duo 氏が次のことを一緒に学びます: deque を使用して効果的に要素をポップアップおよび追加する deque 内の任意の要素にアクセスする deque を使用して効率的なキューを構築する deque を使用して要素を右側に追加するPython リストの最後とポップアップ要素の操作は、一般に非常に効率的です。時間計算量を Big O で表現すると、O(1) であると言えます。そして、新しい要素を受け入れるために基になるリストを増やすために Python がメモリを再割り当てする必要がある場合、これらは

ヒープとスタックの違い ヒープとスタックの違い Jul 18, 2023 am 10:17 AM

ヒープとスタックの違い: 1. メモリの割り当て方法が異なります。ヒープはプログラマによって手動で割り当ておよび解放されますが、スタックはオペレーティング システムによって自動的に割り当ておよび解放されます。2. サイズが異なります。スタックは固定されていますが、スタックはオペレーティング システムによって自動的に割り当ておよび解放されます。サイズは動的に増加します。3. データ アクセス方法が異なります。ヒープ内ではポインタを介してデータ アクセスが行われますが、スタック内ではデータ アクセスが行われます。アクセスは変数名を通じて行われます; 4. データのライフ サイクル 、ヒープではデータのライフ サイクルが非常に長くなる可能性がありますが、スタックでは、変数のライフ サイクルは変数が配置されているスコープによって決まります。

Javaヒープとスタックの違いは何ですか Javaヒープとスタックの違いは何ですか Dec 25, 2023 pm 05:29 PM

Java ヒープとスタックの違い: 1. メモリの割り当てと管理、2. ストレージの内容、3. スレッドの実行とライフサイクル、4. パフォーマンスへの影響。詳細な紹介: 1. メモリの割り当てと管理 Java ヒープは動的に割り当てられるメモリ領域であり、主にオブジェクト インスタンスの保存に使用されます Java では、オブジェクトはヒープ メモリを通じて割り当てられます オブジェクトが作成されると、Java 仮想マシンは対応するメモリを割り当てますシステム上のスペースを確保し、ガベージ コレクションとメモリ管理を自動的に実行します。ヒープのサイズは実行時に動的に調整したり、JVM パラメータなどを通じて設定したりできます。

Golang でのエラー処理: カスタム エラー タイプの使用シナリオ Golang でのエラー処理: カスタム エラー タイプの使用シナリオ Aug 12, 2023 am 09:19 AM

Golang でのエラー処理: カスタム エラー タイプの使用シナリオ Golang の開発において、エラー処理は非常に重要かつ不可欠な部分です。優れたエラー処理メカニズムは、問題を迅速に特定して解決し、コードの可読性と保守性を向上させるのに役立ちます。標準のエラー タイプの使用に加えて、Golang はカスタム エラー タイプの機能も提供しており、問題の性質をより適切に反映するために、特定のビジネス シナリオに従って独自のエラー タイプを定義できます。この記事では、カスタム エラー タイプの使用シナリオを紹介します。

See all articles