問題タブ [memory-efficient]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 二分探索木とマルチマップ
私が解決しなければならない問題は、IPアドレスプレフィックスとそれに関連付けられたデータをツリーに入力して、後でクエリできるようにする必要があることです。私はファイルからこれらのアドレスを読み取っていますが、ファイルには1,600万ものレコードが含まれている可能性があり、ファイルに重複がある可能性があり、それらも保存する必要があります。
独自の二分探索木を作成しましたがTreeMap
、Javaでは赤黒木を使用して実装されていることを学びましたが、TreeMap
重複を含めることはできません。
クエリにO(logn)
時間がかかります。
データ構造はRamにある必要があるため、1600万ノードをどのように格納するかもわかりません。
質問したかったのですが、グアバのようなライブラリを使用してIpsをマルチマップに挿入するのは、パフォーマンスに大きな影響を与えるでしょうか?それとも、これを行うためのより良い方法はありますか?
python - ブレーク対ブール?
私のプログラミングの基礎の先生は、クラスの 1 つで、「break」または「continue」キーワードを使用すると、ブール値を使用してループを終了するよりも効率が悪いと言いました。
これが当てはまるかどうかを確認するために、Python で記述されたプログラムを作成して実行しました。
3 回実行して結果を平均したところ、breakTest の方が 6.25 秒高速であることがわかりました。
break キーワードはより効率的ですか、それとも私のコードは間違っていますか?
javascript - Javascriptで関数を設定する最良の方法(おそらくクロージャーを介して?)
オブジェクトの配列を表すJSONを返すWebサービスを呼び出すWebアプリケーションがあります。各オブジェクトにはいくつかのフィールドがあります。アイデアを与えるためのJSONの例を次に示します。
これが戻ってきたら、jQueryのparseJSON()メソッドを使用して、これをオブジェクトの配列に拡張します(「データ」値を保持します)。それはすべて問題ありませんが、配列を取得した後、各配列スロットで動作できるいくつかの関数があります。たとえば、end_timeとstart_timeの間の時間経過を出力するGetDuration()という関数があるとします。いずれにせよ、私はいくつかの関数(おそらく15)を定義し、この時点で、配列全体を反復処理し、関数のコピーですべてのオブジェクトを膨らませます。例
これはもっと効率的にできると思います。今のところ、配列項目ごとに同じ関数の個別のコピーがあると思いますが、これは必須ではありません。また、処理時間の遅れにも気づきましたが、これを短縮できると期待しています。この状況で役立つと思われるjavascriptクロージャについて読んだことがありますが、クロージャで関数を記述した経験はあまりありません。クロージャーを設定してから、JSONを変更して、クロージャー型のオブジェクトに何らかの形で膨らませることはできますか?または、今日行っているように通常のjavascriptオブジェクトに膨らませて、作成したクロージャを指すようにオブジェクトタイプを変更しますか?
任意の考えや提案をいただければ幸いです。
ありがとう...
-ベン
android - Androidでアップスケールされたピクセルアートを効率的に描画するにはどうすればよいですか?
たくさんのピクセルアートが入ったゲームを作っています。私のゲームの標準ボタンは約12x12ピクセルで、表示用に5倍に拡大されています。画面によっては、すべての文字も2倍に拡大縮小されます。問題は、これらすべての画像をアップスケールされたビットマップに保存すると、Androidでメモリ不足エラーが発生することです。描画するたびにスケールアップしようとすると、ゲームの実行が非常に遅くなります。
そのため、私は独自のPixelArtBitmapクラスを作成しました。それは素晴らしい画像をもたらし、メモリをほとんど必要としませんが、非常に非効率的で、私のfpsを大幅に落とします。描画するたびにビットマップをスケールアップするよりも高速です。クラスは次のとおりです。
では、どうすればこのクラスを高速化できますか、それともこれを正しく行うためのまったく異なる方法がありますか?
c++ - パフォーマンスとキャッシュ効率に対する 2 ビットのビットフィールド配列の影響?
私は 2 ビット配列を必要としています。メモリの節約にはまったく関心がありませんが、キャッシュ ミスを最小限に抑え、キャッシュ効率を最大化することに関心があります。bool の配列を使用すると、4 倍のメモリが使用されます。つまり、キャッシュ内の使用可能なデータのチャンクごとに、使用されない 3 つのチャンクが存在することになります。したがって、技術的には、ビットフィールドを使用すると、キャッシュの一貫性が 3 倍向上します。
計画は、バイトの配列として実装し、4 つの等しいビットフィールドに分割し、div 関数を使用して整数の商と剰余を、おそらく 1 つのクロックで取得し、それらを使用して右のインデックスと右のインデックスにアクセスすることです。ビットフィールド。
必要な配列の長さは約 10000 要素なので、非常に高密度のパック データが作成されます。2 つの実際のビットを使用すると、配列全体を L1 キャッシュに収めることができますが、バイト配列を使用すると、これは不可能になります。
私の質問は、パフォーマンス指向のタスクでこれが良いアイデアであるかどうかを誰かが教えてくれるかどうかです.2ビット配列を実装する価値があるかどうかはわかりますか? 確かに、知るための最良の方法はプロファイリングですが、事前の情報は有用であり、高く評価されます。
matlab - 配列内で行のセクションを別のセクションと交換するにはどうすればよいですか?
私は単純な遺伝的アルゴリズム(GA) をコーディング中です。不必要にforループを使用した領域はおそらく無数にあります。MATLAB をより効率的にするためのヒントと、私の質問への回答をお願いします。私が言うことができる限り、私は成功しましたが、確信はありません。このコードが定義する領域は、シングル ポイントクロスオーバーです。
これが私が試したことです...
- ここで、「crossPoints」は、バイナリ コード化された 2 つの染色体間の単一ポイント クロスオーバーが必要なポイントです。
- 'popSize' は母集団のサイズであり、私のコードでは偶数である必要があります
- 'isolate' は、互いに交換する必要がある 2 つの行のセクションを定義します
- 「chromoParent」は、一点交叉によって変更する必要がある初期集団です
- 'chromoChild' は、結果の母集団です。
- 'chromoParent' と 'chromoChild' は両方とも、popSize x 25 バイナリ文字のサイズの配列で表されます
この問題について私が考えている方法に間違いを見つけられますか? 同じことを達成するための最も効率的な方法 (計算時間) は何ですか? ここで学んだ原則をコードの残りの部分に適用し始めることができるように、可能な限り広く教えていただけると助かります。
ありがとうございました。
memory - 検索ベースの問題ソルバーを実装するのに適したプログラミング言語はどれですか?
私は現在、人工知能クラスの最終プロジェクトに取り組み始めています (コンピューター サイエンスの学士号の一環として)。このプロジェクトでは、人工知能の分野で興味深い問題を選択し、クラスから 1 つまたは複数のトピックを展開して、それを解決する必要があります。後で結果を説明するレポートを作成し、レポートと作成したコードの両方を提出します。
明らかに、私たちは古典的な問題の研究において最先端に匹敵することは期待されていませんが、珍しい問題を(かなりの程度まで)調べて解決することを期待されています(このアプローチを選択するほとんどの人は、単純なコンピューターを解決することを選択するか、 AI研究コミュニティによってまだ完全に解決されていないボードゲームなど)、またはより一般的な問題を斬新な方法で調査し、おそらく新しい興味深いヒューリスティックまたは既存のアルゴリズムへの変更を提案します. 後者の場合、最新の研究結果を上回ることは期待されておらず、新しい視点を提供するだけです。
私のパートナーと私がこのプロジェクトのために選んだテーマは倉庫番で、これは私たちを 2 番目のグループに分類します (これは死ぬほど研究されていません。なぜなら、共通のテスト セットの 3 分の 2 しか最高のソルバーで解決できないからです。この問題に対する最先端のソルバーは複雑すぎて、パートタイムの 2 週間のプロジェクトでそれらに近づこうとは思えません)。検索問題のアプローチを使用して倉庫番の問題を解決したいと考えています。
とにかく、倉庫番ソルバーの実装を開始する前に、実行を意図した検索ベースのソルバーの実装に使用するのに、私たちがよく知っている数少ない言語 (C、C++、Java、および Python) のどれがより適しているか疑問に思い始めました。非常に大きな検索空間での検索 (倉庫番には非常に深い検索ツリーがあり、解決するのに 300 回以上の移動が必要な問題と、非常に高い分岐係数 [一部の問題では 100 以上] があります。この高い分岐係数は、次の場合に達成されることに注意してください。プレイヤーの移動ではなく、ストーン\ボックスの移動のみが考慮されるため、各状態で、4 つの方向のいずれかに任意のストーンを移動できます)。
私がこの問題を検討し始めた主な理由は、人工知能に関する別のコース (製品設計への AI 技術の適用を扱う) で、可能なすべての部屋デザインの状態空間を検索して部屋を設計する自動ルーム デザイナーを作成したためです。 (指定された部屋のサイズと家具のセットを使用して) 最高スコアの状態を返します (いくつかのヒューリスティックによって測定されます)。このプログラムは Java で書かれており、実行のたびに数万の検索ノードを検索しただけでメモリ不足になりました。これが起こった主な理由は、そのプロジェクトに非常にオブジェクト指向のアプローチを選択したためだと思います。それは Java で書かれており、すべての検索状態はオブジェクトによって表され、そのようなすべての状態は、サーチャー オブジェクトによって到達されると、
さて、問題の一部はメモリ集約型アルゴリズム (A*) の使用と、それを実装するために選択した方法にあることがわかりましたが、Java の使用も問題の一部であったかどうか疑問に思っています。
1. 検索問題と検索アルゴリズムを実装する場合、一般的にどのプログラミング手法がより適しているか? (オブジェクト指向、関数型、またはその他)
2. 検索問題と検索アルゴリズムを実装する場合、Java、C、C++、または Python のどのプログラミング言語がより適していますか? (他の言語も可能ですが、その構文が前述の言語のいずれかに非常に類似している場合に限られます)
具体的には、これらの言語のどの機能とプロパティを使用して、非常に大きな検索空間をメモリ (および実行時間) 効率的な方法で検索することを目的とした問題解決ツールを実装できますか?
c++ - C にポインターなしでアドレス/参照による受け渡しがないのはなぜですか?
ポインター渡しを使用する C++ でのこの swap 関数の簡単なテストを考えてみましょう。
このプログラムは、アドレスで渡した場合よりも多くのメモリを使用しますか? この関数宣言のように:
この参照渡しバージョンの C++ 関数は、ポインター変数を作成する必要がないため、使用するメモリが少なくなりますか?
また、C には、C++ と同じ「参照渡し」機能がありませんか? もしそうなら、それはメモリ効率の良いコードを意味するので、そうではありませんか? そうでない場合、Cがこの機能を採用しないという背後にある落とし穴は何ですか。私が考慮していないのは、C++ がおそらく舞台裏でこの機能を実現するためのポインターを作成するという事実だと思います。これはコンパイラが実際に行うことであり、C++ にはコードがきれいになる以外に真の利点はありませんか?