どのように理解することは、「我々は成熟した時間の複雑さを持っていることのいずれかの配列のk番目に大きな数のO(n)のアルゴリズムです」

第二版でのオファーを受賞:問題解決「のインタビューの質問に39倍以上の配列を出現数の半分以上」、非常に多くの言葉があります:
「我々は、配列はO(n)のアルゴリズムで取得する最初のいずれかの複雑さを成熟する時間を持っているが、多数のK、「
私は、少なくとも私は誤解されている聞かせて、この文は、何かが間違っていると思います。

次のように行くのコードは次のとおりです。

func partition(nums []int, l, r int) int {
    // 1. 哨兵 取第一个元素
    v := nums[l]
    // 2. 大小分区的定义和初始化 [l+1,p]<v && [p+1,cur-1]>v 
    p := l
    // 3. 处理哨兵之后的每一个元素
    cur := l + 1
    for ; cur <= r; cur++ {
        if nums[cur] < v {
            nums[cur], nums[p+1] = nums[p+1], nums[cur]
            p++
        }
    }
    nums[p], nums[l] = nums[l], nums[p] // 哨兵和小分区的最后一个元素交换,使得哨兵左边是小的,右边是大的.
    return p
}

Partionタイムコードの複雑ためループの大きなパーティション、またはパーティションに小の各数を分割する必要があるため、O(N)です。

しかし、我々は位置番号のようなものを得ることができ、各パーティションは、我々が指定することはできません。だから、私たちは「K-大」の数に得ることができるように、我々は最初のk多数であることを起こる歩哨を選択するまで、複数のオペレーティングを分割する必要があります。最悪の場合には、我々はむしろ、O(n)と比べて、最悪時間計算量がn * O(n)は、n番目のパーティションを呼び出す必要があります。

簡単に私たちのためとして、安全性の提供に急行誤解を証明する:ちょうど呼び出す一次パーティションは、kの多数を見つけることができるようになります、これは確率イベントである必要があり、確率は1である/ N(k番目の最大数が選出されるために発生した場合にのみ、セントリ、Kの確率の多数がセンチネル1 / n)のために選択した場合にのみ成立。現実には、私が呼び出す必要があり、ある多次k番目の最大数を見つけるためにパーティションを。

また、以下の質問は、これらのアルゴリズムのパーティション機能の使用に関連し、彼らの共通の特徴は、パーティションのデジタルxxxの場所を見つける必要があります。

  1. 大多数の要素(この議論のブログのタイトル):メートルパーティション番号の検索位置(中央値:率n / 2)
  2. k番目の配列の要素を最大:partitonは数kの位置を見つけます
  3. kの最小数:40勝は、オファーが内接するk個のpartitonは位置の数を見つけることが、唯一の数kの左側に位置を戻し、数がセンチネルよりも小さいです

議論ではなく、言語にようこそ、私は、JavaやPython、囲碁言語、笑のネット、研究開発に従事して左折します。

私はインタビューの質問に直面して磨くが、私は何回かの操作を行いますが深く知恵アルゴリズムの発明者、本当にNiubiに感銘を受けました。

おすすめ

転載: www.cnblogs.com/yudidi/p/12148678.html