タグ付けされた質問 「data-structures」

ソフトウェアアプリケーション内でのデータの効率的な保存と表現に関する質問。

3
AVLツリーと現実の世界
学校では、挿入または削除時にAVLツリーのバランスを取る方法を教えています。 この種の知識は、実際に実際どのように役立つのでしょうか?誰かがこの種の知識が実際にいつ役立つのか例を示すことができますか? 私が見たものから、職場ではそのような詳細はほとんど出てきません... アルゴリズムと一部のデータ構造に関する詳細な知識が重要になることはありますが、AVLツリーの回転(および同様の詳細な概念)などの詳細は重要ではありません。 ありがとう!

7
intのようなプリミティブ型をtypedefで処理する方法
私は次のようなC ++コードをたくさん見ましたtypedef。 typedefC ++プリミティブを使用するのとは対照的に、このような多くのを使用する利点は何ですか?これらの利点も達成できる別のアプローチはありますか? 最終的に、データはすべてメモリに保存されるか、ビットとバイトとしてワイヤを介して送信されますが、本当に重要ですか? types.h: typedef int16_t Version; typedef int32_t PacketLength; typedef int32_t Identity; typedef int32_t CabinetNumber; typedef int64_t Time64; typedef int64_t RFID; typedef int64_t NetworkAddress; typedef int64_t PathfinderAddress; typedef int16_t PathfinderPan; typedef int16_t PathfinderChannel; typedef int64_t HandsetSerialNumber; typedef int16_t PinNumber; typedef int16_t LoggingInterval; typedef int16_t DelayMinutes; typedef int16_t …

2
セットをJSONで表す方法は?
JSONは、スカラー、配列/リスト、およびマップのデータ構造(Javaでの同等物)をサポートしています。 A Setは、そのままではJSONでサポートされていません。 JSONでセットを表す方法をいくつか考えました。 [1]-リストとして ただし、リストには独自の順序があるため、次の2つのリストはリスト["a", "b"]と["b", "a"]同じではありませんが、セットと同じである必要があります。 [2]-地図として マップのキーセットを使用し、値は無視してください。 しかし、再び、標準的な比較を使用すると、2つはマップと同じではありません。 {"a": "foo", "b": "bar"}、 {"a": null, "b": null} [3]-マップとして、特別な値で スカラを取り、言う0かnull、またはマップのすべてのキーの値になるように強制します。 {"a": 0, "b": 0} このように、標準の比較ツールでは、キーの順序が変更されても、オブジェクトは同じです。 ただし、この手法は、JSONドキュメントを無関係なデータで汚染します。 [4]-順序付きリストとして 最初の提案に戻りますが、今回は順序付きリストです。この種の比較問題を解決します。 ただし、並べ替えの複雑さも考慮に入れる必要があります。また、マップ表記は重複を処理しますが、並べ替えリストは処理しません。例: {"a": 400, "a": 9}として処理されますが{"a": 9}、["g", "g"]常に処理されます["g", "g"]。 そうは言っても、リスト表記はより明確であるように見えますが、マップ表記はキーの複製に対してより堅牢であり、特別な値について一貫性を保つことが難しくなっています(nullそのための良い選択のように見えますが)。 どう思いますか?セットをJSONでどのように表現しますか? PS これは単にJSONに関する問題であることに注意してください。yamlのような他のフォーマットも利用できることは知っています。まだ...

4
文字列のリストを単一のデータベースフィールドに格納することは悪い考えですか?どうして?
最近、いくつかのレガシーシステムに取り組み始めました。それを開発した人々は、データベーステーブルの単一のフィールドに文字列のリストを格納するというアイデアを思いつきました。これは、データベースに表現もデータもないオブジェクトの識別子であるとしましょう。その識別子の範囲は、本番環境では比較的小さくなります。 一方、私の直感と「良いデザインの好み」は、別のテーブルで表現する必要があることを示しています(多対多の関係を表すために使用されるテーブルと同様)。 彼らのアプローチは本当に悪いのですか?リファクタリングを開始する方が良いでしょうか?はいの場合、元の設計が将来どのような悪影響をもたらす可能性がありますか?そのアプローチを説明するリレーショナルデザインの原則はありますか? コメントの返信を編集: おそらく、彼らはこのアプローチを使用して、階層構造化などの特定の問題を巧妙な方法で解決していません。最もありそうなシナリオは、彼らが時間のプレッシャーの下で単に働いていて、できるだけ早く新機能を実装する必要がある場合でした。 以前はフィールドが単一の値を表していたと思います。彼らは複数の値を保存する機能を実装する予定で、データベースの移行を回避しようとしました。

4
C構造体は、関数を持っているように動作できますか?
struct構造体がメンバーを持つことはできますが、関数を持つことはできないCとs を使用します。簡単にするために、名前を付けた文字列の構造体を作成し、文字列のインデックスと位置の文字を置き換える文字をどこでstrできるようにするかを想定します。構造体は関数を持たないか、この動作を実装し、構造体が実際に構造体だけが新しい構造体にコピーして更新する(単純な)関数を持つことができることを模倣する方法がまだあるので、これは決して不可能でしょうか?それができるフィールド?str.replace(int i, char c)ici したがってreplace、アクセスされたときなどに更新される新しい構造体を指す構造体の3番目のメンバーである可能性があります。できますか?それとも、私の意図を妨げる組み込みのものや、何らかの理論やパラダイムがありますか? 背景は、私がCコードを書いていることであり、OOP言語のライブラリビルトインであることがわかっている関数を再発明し、OOPは文字列とコマンドを操作する良い方法だと思います。

4
cに構造体をパックする標準的な方法または標準的な代替手段はありますか?
CIでのプログラミングでは、GCC __attribute__((__packed__))属性を使用して構造体をパックすることが非常に重要であることがわかったので、揮発性メモリの構造化されたチャンクをバイトの配列に簡単に変換して、バスを介して送信したり、ストレージに保存したり、レジスタのブロックに適用したりできます。パックされた構造体は、バイトの配列として扱われる場合、パディングを含まないことを保証します。これは無駄であり、セキュリティリスクの可能性があり、ハードウェアとのインターフェースの場合に互換性がありません。 すべてのCコンパイラで動作する構造体をパックするための標準はありませんか?そうでない場合、私はこれがシステムプログラミングにとって重要な機能であると考える際に外れ値ですか?C言語の初期のユーザーは、構造体をパックする必要性を見つけられなかったか、何らかの代替手段がありましたか?

2
データ構造とアルゴリズムの関係は何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 データ構造の優れたオンラインコースを探していましたが、Googleはアルゴリズムコースの結果も返すことがわかりました。 このコースでは、分割統治法、グラフアルゴリズム、実用的なデータ構造(ヒープ、ハッシュテーブル、検索ツリー)、ランダム化アルゴリズムなど、アルゴリズム設計のいくつかの基本原則を学び ます。[ソース] そして このクラスの終わりまでに、グラフやその他の重要なデータ構造用の新しいアルゴリズムを考案し 、これらのアルゴリズムの効率を評価するために必要な重要な概念を理解できます。[ソース] そして このコースでは、計算問題の数学的モデリングについて紹介します。これらの問題を解決するために使用される一般的なアルゴリズム、アルゴリズムパラダイム、およびデータ構造をカバーしています。[ソース] 私の質問は次のとおりです。アルゴリズムとデータ構造は密接にリンクしているので、一緒に理解しなければならないのですか、それとも他のトピックよりも基礎的なトピックですか? 編集:この質問を終了する投票者のために、この質問を改善する理由と方法を教えてください。適切な質問をすることを学ぶことは、教育プロセスの一部です。

5
異種リストに特定の目的はありますか?
C#とJavaのバックグラウンドから来た私は、リストが同種であることに慣れていて、それは私にとって理にかなっています。私がLispを取り上げ始めたとき、リストが異種であることに気付きました。dynamicC#でキーワードをいじり始めたとき、C#4.0の時点で、異種のリストが存在する可能性があることに気付きました。 List<dynamic> heterogeneousList 私の質問は、ポイントは何ですか?異種リストは、処理を行う際のオーバーヘッドがはるかに大きくなるようであり、1つの場所に異なる型を格納する必要がある場合は、異なるデータ構造が必要になる場合があります。私の素朴さはそのい顔を育てているのですか、それとも異種のリストを持つことが本当に役立つときがありますか?

8
ほとんど変更されない「合理的に大量の」データを保存する実用的な方法は?
事前に計算されたルックアップテーブルなどについて考えます。アプリケーションで値をハードコーディングする代わりにデータベースを使用する方が適切なのはどの時点ですか?値は変更されず、メンテナンス開発者からうまく分離されます。100個の値、1k、10k、100k?約4万の値を保存したいです。現時点では、これはマシン生成のswitchステートメントです(VS2010は不満です)。 編集: 誰かが好奇心があるなら、私はこれにどのようにアプローチしたのですか?私のデータは2つの100k要素のfloat配列に保存可能でしたので、それは私がやったことです。データを生成するのに約20秒かかりましたので、一度それを行い、BinaryFormatterを使用して埋め込みリソースにシリアル化しました。データの解凍には、アプリケーションの起動時に約5ミリ秒かかり、私が置き換えていたデータベース実装(これらのハードコードされた値は以前に保存されていた)をほぼ45,000倍上回ります。

8
ストリームとキューの違いは何ですか?
ストリームとキューの違いは何ですか?どちらも要素の順序付けされたセットの概念を持っていますが、「挿入」/「抽出」(ストリーム)と「エンキュー」/「デキュー」(キュー)の実装やボキャブラリが異なる傾向があります。これらは交換可能ですか?彼らは異なる概念やパターンを提案していますか?もしそうなら、違いは何ですか?

2
ストリームマニピュレータ(endl)または改行エスケープ文字(\ n)を使用していますか?
質問している特定のコンテキストはありませんが、C ++の初心者向けの本を読んでいるときに、ストリームオブジェクトを処理するときにendlストリームマニピュレーターと改行エスケープ文字の両方を使用していることに気付きました。 例は次のとおりです。 cout << "Hello World" << endl; cout << "Hello World\n"; 私の質問は: 特定の状況でストリームマニピュレーター(endl)を使用し、別の状況でエスケープ文字を使用する方が適切ですか? 2つのうちの1つを使用するのが賢明な効率上の欠点はありますか? それらは完全に交換可能ですか? エスケープシーケンスは単一の文字としてメモリに格納されることを読みました。それは、低メモリ消費のためにendlを使用することがより適切であることを意味しますか? ストリームマニピュレータはメモリを使い果たしますか? おかげで、StackExchangeが間違ったセクションにこれを投稿した場合、データ構造としてカウントされると思いました。

3
バイナリツリーは、階層データを格納する特定の目的に役立ちますか?それらの標準的な使用は何ですか?
バイナリツリーの構造と、それらのトラバース方法を理解しています。しかし、私はそれらの実際の使用法、プログラムとプログラミングの目的を実現するのに苦労しています。階層データの「実際の」例について考えると、ほぼ確実に2つ以上の子があります。たとえば、家系図では、母親には2人以上の子供がいることがよくあります。 「バイナリツリー」は、配列とリストの処理時間が高速であるため、線形関連データの保存にのみ有効ですか?または、階層データを保存する特定の目的に役立ちますか?もしそうなら、二分木の適用の例は何ですか。ノードに最大 2つの子があるようなデータは何ですか?

2
償却分析?(最悪の場合の性能保証)
償却分析とは何ですか?また、プログラムで最悪の場合のパフォーマンス保証を達成するのにどのように役立ちますか? 私は、次のテクニックがプログラマーが最悪のパフォーマンス保証を達成するのを助けることができると読んでいました(つまり、私自身の言葉:プログラムの実行時間が最悪のキャストの実行時間を超えないことを保証します): ランダム化アルゴリズム(たとえば、最悪の場合、クイックソートアルゴリズムは2次ですが、入力をランダムに並べると、実行時間が線形であることが確率的に保証されます) 操作のシーケンス(分析では、データとクライアントが実行した操作のシーケンスの両方を考慮する必要があります) 償却分析(パフォーマンス保証を提供する別の方法は、すべてのオペレーションの合計コストをオペレーション数で割って追跡することにより、コストを償却することです。この設定では、平均コストを維持しながら、いくつかの高価なオペレーションを許可できますつまり、少数の高価な操作のコストを、その一部を多数の安価な操作のそれぞれに割り当てることで分散します) 著者は、償却分析を達成する方法の1つの例として、Stackの配列データ構造のサイズ変更の使用に言及しましたが、償却分析とは何か、実際にはどのようにできるかはまだわかりません最悪の結果を達成するために実装か(データ構造?アルゴリズム?) -キャストパフォーマンス保証

4
ツリーは「最初の子、次の兄弟」構造で構成されていますか?そうでない場合は、なぜですか?
通常、ツリーデータ構造は、各ノードがそのすべての子へのポインタを含むように編成されます。 +-----------------------------------------+ | root | | child1 child2 child3 | +--+------------------+----------------+--+ | | | +---------------+ +---------------+ +---------------+ | node1 | | node2 | | node3 | | child1 child2 | | child1 child2 | | child1 child2 | +--+---------+--+ +--+---------+--+ +--+---------+--+ | | | | | | これは自然に思えますが、いくつかの問題があります。たとえば、子ノードの数が異なる場合、子を管理するには配列やリストなどが必要です。 代わりに(最初の)子ポインターと(次の)兄弟ポインターのみを使用すると、次のようになります。 +-------------------+ …

2
Brodalキューの擬似コード
Brodalヒープに関するリソースをもっと探しています。私が見つけたのはBrodal-Okasakiヒープのhaskell実装だけですが、スキューヒープであると思いますが、これは正しいですか?さらに、私はHaskellで読み書きができないので、あまり役に立ちません。誰かが擬似コード、C、C ++、PythonでBrodalキュー実装を持っていますか(または知っていますか)? 上記の私の仮定が間違っている場合も修正してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.