定義された要素の配列をクリアする。 - ページ 21

 
でどのような挙動になるかはわかりません。
ArraySetAsSeries(array,true);
前回のバリアントでは、それにもチェックを入れました。必要な人が使えばいいんです。
ファイル:
 
Реter Konow:

そうですね。しかし、提供されたアルゴリズムが空白を残さないことをどうやって確認するのでしょうか?チェックサムでは証明できない。要素数も関係ない。結局のところ,この関数は配列のサイズが変更される前に存在していた要素を数えます.

ほとんどの場合、NULLでクエリを送信することで問題なく実装されています。

タグのコノウ

アルゴリズムにはもう一つ要件がある。不要な項目を削除した後、配列内の項目を正しく配置することである。このチェックが先に行われている必要があります。そして、スピードのチェックがあります。

コードでは、どれが何を返すかを説明しています。シャッフルアレイがある。別の配列にあります。

追伸:念のため。私の機能では、いくつかのチェックがありますが、使用されていません。しかし、すでにこれだけでなく、それ以上のものを備えているのです。

 

参加者やその場のプロ意識を疑っているわけではありません。私は、チェックサムチェックの欠陥と、新しい配列の要素の配置が正しいかどうかの追加検証の必要性を指摘したに過ぎません。

もしこれがすべて正しいのであれば、私は当然のように第2位を獲得したことになる。

私の実務では、具体的な操作の速さを考えることはほとんどありません。それよりも、解答の簡潔さ、わかりやすさを重視しています。このエントリーには、驚きました。

if(Arr[q]==val){deleted++; q--;}

が遅くなる可能性があります。

でも、アルゴリズムの評価基準にもう一つ、ソリューションのコンパクトさを加えたら、たぶん1位だと思います。

SpeedとCompressionの2つの基準を組み合わせて、アルゴリズムの平均スコアを計算すると、私は上位に位置することになります。

しかし、フェドセーエフのバージョンは、私のものよりさらに凝縮されている。
 
Реter Konow:

しかし、アルゴリズムの評価基準としてもう一つ、Solution Compressionを加えると、おそらく私は1位でしょう。

あなたのバージョンのメインループ。

for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val)
        {
         deleted++; 
         q--;
        }
      q++;
     }

と、これはフェドセーエフのもの。

for(;i<sz;i++)
     {
      if(a[i]!=v)
        {
         a[j]=a[i];
         j++;
        }
     }

どちらのバリエーションも同じことをします。最も簡潔なのは誰ですか?

 
Nikolai Semko:

メインサイクルのあなたのバージョン。

と、これはフェドセーエフのもの。

どちらも同じことをするのです。最も簡潔なのは誰?

彼です。代わりに持っているのは...

for(int a1=0; a1<ArraySize(Arr); a1++)
for(;i<sz;i++)

より簡潔である)

 
Реter Konow:

彼は持っています。代わりに持っているのは...

こちらの方が簡潔でいいですね))

それは、コンパイラも同じです。

単に無駄なものが多いから皆より動作が遅いだけでしょ(トピックから最初の選択肢は考えていない)。

Fedoseyevのコードでは、1回の ループパスでチェック、代入、インクリメントを1 回ずつ行って います(ループ構成のためチェックとインクリメントはカウントしていません)。

これに対して、チェックが2つ 2変数の和が1つ、インクリメントが3 つ、代入が1 つありますね。

 
for(int a1=0; a1<ArraySize(Arr); a1++)

コンパイラが最適化してくれないと、ArraySizeが 繰り返し実行されてしまいます。

 
Aleksey Lebedev:

コンパイラが最適化してくれないと、ArraySizeが繰り返し実行されてしまいます。

はい、コンパイラは、ループ内で配列のサイズが 変化しない場合、独立してこの関数を1つの値に置き換えて、この関数を1回だけ計算することをチェックしているようです。
何はともあれ、こうすれば。

const int size=ArraySize(Arr);
for(int a1=0; a1<size; a1++)

の場合、関数の実行時間は変わりません。

だから、よりコンパクトにするために、Peterがやったのと同じように書くのが理にかなっているんだ :)
でも、個人的には目にもしみるので、賛成です。毎回関数が呼び出される感じです。

 
Nikolai Semko:

でも、そうですね、個人的には私も切れます。毎回関数が呼び出される感じです。

imhoは、コンパイラに選択肢を与えない方が良いと思います)

質問させてください。

if(count>6) {ArrayCopy

科学的な直感によるものか、それとも正当な理由があるのか?)
 
Aleksey Lebedev:

コンパイラに選択肢を与えない方が良い)

質問させてください。

if(count>6) { ArrayCopy

6つ以上 - 科学的直感で得られる値、その根拠は?)

はい、まさにその通りです。科学的直感のメソッド。私の観測では5から8まであります。この数値を毎回オートチューニングすることで、この作業を自動化することができます。結局のところ、この数字はプロセッサーやシステムによって異なる可能性があるのです。

例えば、CCanvas クラスの ArrayCopy と ArrayFill をすべてこの原理で変更すると、canvas の速度が大幅に向上します。