2017-02-14 2 views
1

私は、コードの問題を解決することによって自分のスキルを高めようとしていました。私はこの1つに達し:https://codility.com/programmers/lessons/9-maximum_slice_problem/max_double_slice_sum/MaxDoubleスライスカダネのアルゴリズムのバリエーションを解決する

私は実際には、理論的に解決策を理解する:アレイ上

  1. 使用Kadaneのアルゴリズムを、すべての指標で合計を格納します。
  2. アレイを逆にして同じ操作を行います。
  3. 一度に両方の結果セットを1つずつループすることによって、両方の合計が最大である点を見つけます。
  4. maxは最大ダブルスライスです。

私の質問は、この問題の解決方法に関するものではありません。私の質問は、これがこの問題を解決できる方法であると想像する方法についてです。使用なされる必要があるで、少なくとも3種類の概念があります。

  1. は、アレイ内のすべての要素が正、または負の場合、それはいくつかの正と負があるときとは異なる場合があることを理解配列内の要素Kadaneのアルゴリズム

  2. は、前方アレイの上に行くと逆転しました。

これにもかかわらず、Codalityはこの問題を「痛い」とタグ付けしています。

私の質問には何か不足していますか?これらの概念のいくつかを知らなくてもこの問題を解決することは難しいようです。

私はゼロから始め、非常に基本的なコンセプトから始めることができ、この問題を解決するために必要なコンセプトに到達するための手法はありますか?それとも、問題を開始する前にこれらの概念を知っていると予想されますか?

今後の必要な概念がわからないような問題を解決するために自己を準備するにはどうすればよいですか?

答えて

1

私はあなたはそれがあるよりも、それがより難しい理由です、あなたが問題をoverthinkingていると思う:

アレイ内のすべての要素が正、または負の場合、それはより異なる場合であることを理解配列にはいくつかの正と負の要素があります。

別のケースである必要はありません。とにかくこの区別を気にせずに動作するアルゴリズムを考え出すことができます。

この区別を理解することから始める必要はありません。だからといって、それまで考える必要はありません。

Kadaneのアルゴリズム

問題は、必要とするものを考え、アルゴリズムを考えてはいけません。通常、10 +段落の問題文は、はるかに少なく表現できます。

問題文を簡単にする方法を見てみましょう。

まず、スライスをトリプレットとして定義します。(x, y, z)。これは、x+1で始まり、z-1で終わり、yを含まない要素の合計で定義されます。

次に、最大合計スライスを求めます。最大スライスが必要な場合は、定義にxzが必要ですか?私たちは最大の合計を得る限り、どこからでも開始して終了させることができますか?

スライスを配列のサブセットとして再定義すると、どこでも起動し、y-1になり、y+1から続きます。ずっと簡単ですね。

このようなスライスは最大限必要です。

yごとに、y+1で始まる最大合計サブアレイとy-1で終了する最大合計サブアレイが必要になると考えられます。これらを見つけることができる場合は、それぞれyのグローバル最大値を更新できます。

どうやってこれを行うのですか?これは、あなたが望むものの半分を行うKadaneのアルゴリズムを指すはずです:最大和サブアレイがいくつかで終わります。xで終わります。

kadane(y - 1) + kadane_reverse(y + 1) 

をし、グローバル最大と比較:あなたは、両側からそれを計算するのであれば、各yのために、あなただけ見つけなければなりません。

ネガとポジティブの特別なケースはありません。考えていない "Kadane's!"あなたが問題を見るとすぐに。

考え方は、その意味を変えずに、できるだけ要件を単純化することです。次に、アルゴリズムと演繹スキルを使用してソリューションに到達します。これらのスキルは時間と経験に磨かれています。

+0

ありがとうございました。あなたは、まずスライスを三つ組(x、y、z)として定義します。これは、x + 1から始まり、z-1で終わり、yを含まない要素の合計で定義されます。 配列が2、3、4、5、6、7の場合、maxサブ配列は配列全体です。そして、反転された最大サブアレイもまたアレイ全体である。したがって、最初の要素と最後の要素を削除するという上記の要件を考慮しません。 (または何かを正しく理解していないのですか?) これは一般的なalgoが処理しない特殊なケースではありませんか? –

+1

@KhojBadamiどのように表示されません。オリジナルの定義と単純化された定義を適用すると、その例の答えはあなたによると、何ですか?いずれにしても、何とかそれが間違っていても、ほとんどの場合は機能し、いくつかのエッジケースを出したり、解決したりするというソリューションがあります。ここでは、これらのエッジケースを処理する方法に焦点を当てることができます。それらを個別に識別して処理するか、ソリューションを処理して処理できるようにします。エッジケースから開始してソリューションの開発を開始しないでください。 – IVlad

+0

さて、「エッジケースから始めて解決策を開発しないでください」。これが私の問題だと思うことです。あなたが元々言っていたように、私は質問がより複雑になっています。あなたが説明したように単純化する必要があります。ありがとうございました。 –

関連する問題