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

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

3
関連する一連のプロパティを独自の構造体/クラスにラップすることは良い習慣ですか?
私の質問は強く型付けされた言語に関係しますが、SwiftでUserオブジェクトを作成します。ユーザーは多数のリンク(FacebookProfile、InstagramProfileなど)を持つことができます。これに関するいくつかの質問。 リンクを独自のオブジェクトでラップすることは良い習慣ですか? struct User { var firstName:文字列 var lastName:文字列 var email:string varリンク:リンク } 構造体リンク{ var facebook:string var instagram:文字列 var twitter:文字列 } それともルーズにすべきですか?技術的にはどちらの方法でも問題ないことはわかっていますが、一般的に、特に読みやすさのために、推奨されるアプローチがあるかどうか疑問に思います。 struct User { var firstName: string var lastName: string var email: string var facebookLink: string var twitterLink: string var instagramLink: string } このようなシナリオでは、リンクはコレクション/リストにする必要がありますか?利用可能なリンクオプションの数は決まっているため、リストの数にしないでください。数は増えていません。私の考えは正しいですか? getUsers、getUser、updateUserなどのユーザーオブジェクト内にネットワークメソッドを配置することは良い習慣ですか? これらは主観的である可能性があることは知っていますが、同様の状況でのベストプラクティスを理解しようとしています。任意のポインタをいただければ幸いです。

4
どこでもデータチェックを導入するのに適したコードスタイルですか?
プロジェクトのサイズが十分に大きいので、頭の中ですべての側面を維持することはできません。その中でいくつかのクラスと関数を扱っており、データを渡しています。 時間の経過とともにエラーが発生し続けることに気づきました。別の関数にデータを渡すときに、データの正確な形式を忘れてしまったためです(たとえば、ある関数が文字列の配列を受け入れて出力し、別の関数は後で記述します)。辞書などに保持されている文字列を受け入れるため、操作している文字列を配列に入れてから辞書に入れるように変換する必要があります)。 どこがどこでどこが壊れているのかを常に把握する必要がないように、私は各関数とクラスを「分離されたエンティティ」として扱うようになりました。場合によっては、データが間違った形式で指定されている場合は、データを再キャストします。 これにより、渡すデータがすべての関数に「適合」することを確認するために費やす時間が大幅に短縮されました。クラスと関数自体が、入力に問題がある場合に警告を発し(場合によってはそれを修正することもあり)、デバッガーを使用してコード全体を処理し、問題が発生した場所を特定する必要があります。 一方、これによりコード全体も増加しました。 私の質問は、このコードスタイルがこの問題の解決に適切かどうかです。 もちろん、最善の解決策は、プロジェクトを完全にリファクタリングし、データがすべての機能に対して均一な構造を持っていることを確認することです。 。 (参考:私はまだ初心者なので、この質問が素朴だった場合は失礼します。私のプロジェクトはPythonで行われています。)

3
多対多の深い関係を管理するための設計パターンはありますか?
複数のアプリケーションで作業しているこのデータパターンを定義するのに問題があります。 それはで構成されています: 多くのオブジェクト自体で構成されるオブジェクトタイプ 2番目のオブジェクトタイプ。各インスタンスは最初のオブジェクトの「多く」を持っています また、最初のオブジェクトの各サブオブジェクトは、2番目のオブジェクトタイプへの関連付けごとに変更できます。 簡単な例は次のとおりです。 一連のレッスンで構成されるプログラミングコース レッスンはセットの割り当てで構成されています。 コースを学生に割り当てることができます。 ただし、コースが生徒に割り当てられると、各レッスンや課題は、削除や追加を行って、元のコースが認識できなくなる可能性があるまで、その生徒に合わせてカスタマイズできます。 私の解決策では、これにより次のような結果になります。 コースを生徒に割り当てると、コースはメモリにロードされます。次に、各サブオブジェクトについて、適切なメタデータを使用して生徒/サブオブジェクト関係オブジェクトが生成されます。基本的に、元のオブジェクトをテンプレートとして使用して、必要なカスタマイズ可能なオブジェクトを生成しています。 これにより、サブオブジェクトがより複雑になり、番号が付けられるため、大量のデータが生成されます。このデータパターンを操作するために必要なロジック/複雑さの量を減らすための最適化またはパターンがあるかどうかと思います。

3
クリーンなコードとハイブリッドオブジェクトおよび機能羨望
そのため、最近、コードにいくつかの主要なリファクタリングを行いました。私がしようとした主なことの1つは、クラスをデータオブジェクトとワーカーオブジェクトに分割することでした。これは、とりわけ、Clean Codeの次のセクションに触発されました。 ハイブリッド この混乱は、半分のオブジェクトと半分のデータ構造である不幸なハイブリッドデータ構造につながることがあります。それらには重要な機能を果たす関数があり、パブリック変数またはパブリックアクセサーとミューテーターのいずれかがあり、すべての目的と目的のためにプライベート変数をパブリックにして、他の外部関数がそれらの変数を手続き型プログラムが使用する方法で使用するように誘惑しますデータ構造。 そのようなハイブリッドは、新しい関数を追加することを難しくしますが、新しいデータ構造を追加することも難しくします。彼らは両方の世界で最悪です。それらを作成しないでください。それらは、作者が関数や型からの保護を必要としているかどうか、またはさらに悪いことに無知である混乱した設計を示しています。 最近、私はワーカーオブジェクトの1つ(たまたま、Visitorパターンを実装する)のコードを見て、これを確認しました。 @Override public void visit(MarketTrade trade) { this.data.handleTrade(trade); updateRun(trade); } private void updateRun(MarketTrade newTrade) { if(this.data.getLastAggressor() != newTrade.getAggressor()) { this.data.setRunLength(0); this.data.setLastAggressor(newTrade.getAggressor()); } this.data.setRunLength(this.data.getRunLength() + newTrade.getLots()); } 私はすぐに「!このロジックがであるべき機能の羨望自分自身に言ったData-特に、クラスhandleTradeメソッド。handleTradeとupdateRunする必要があり、常に一緒に起こります」。しかし、「データクラスは単なるpublicデータ構造です。それを始めれば、ハイブリッドオブジェクトになるでしょう!」 何が良いのか、そしてその理由は?どちらを行うかをどのように決定しますか?

5
重複した四分木
四分木を実装しています。このデータ構造を知らない人のために、次の小さな説明を含めます。 クワッドツリーはデータ構造であり、3次元空間でのオクトリーと同じようにユークリッド平面にあります。クワッドツリーの一般的な用途は、空間インデックスです。 それらがどのように機能するかを要約すると、クワッドツリーは、最大容量と初期バウンディングボックスを持つコレクションです(ここでは長方形としましょう)。最大容量に達したクワッドツリーに要素を挿入しようとすると、クワッドツリーは4つのクワッドツリーに分割されます(その幾何学的表現は、挿入前のツリーの4分の1の面積になります)。各要素は、その位置に応じてサブツリーに再配布されます。長方形を操作するときの左上の境界。 したがって、クワッドツリーはリーフであり、その容量よりも要素が少ないか、4つのクワッドツリーを子として持つツリー(通常、北西、北東、南西、南東)です。 私の懸念は、重複を追加しようとした場合、同じ要素が数回または同じ位置にあるいくつかの異なる要素である場合、四分木はエッジの処理に根本的な問題があることです。 たとえば、容量が1の四分木と、境界ボックスとして単位長方形を使用する場合: [(0,0),(0,1),(1,1),(1,0)] そして、左上の境界が原点である長方形を2回挿入しようとします(または、N> 1の容量を持つ四分木にN + 1回挿入しようとした場合も同様です)。 quadtree->insert(0.0, 0.0, 0.1, 0.1) quadtree->insert(0.0, 0.0, 0.1, 0.1) 最初の挿入は問題になりません: ただし、最初の挿入でサブディビジョンがトリガーされます(容量が1であるため)。 したがって、両方の長方形は同じサブツリーに配置されます。 次に、2つの要素が同じ四分木に到着し、サブディビジョンをトリガーします… 以下同様に、サブディビジョンメソッドは無期限に実行されます。なぜなら、(0、0)は、作成された4つのうち常に同じサブツリーにあるため、無限再帰問題が発生するためです。 重複した四分木を持つことは可能ですか?(そうでない場合、それをとして実装できますSet) 四分木のアーキテクチャを完全に壊すことなく、この問題をどのように解決できますか?

1
独自のAPIに最適なデータ構造
Stack Exchangeネットワーク用のEmacsメジャーモードを作成する初期段階です。Emacsを定期的に使用している場合、これは最終的にあなたに利益をもたらします。 Stack ExchangeのAPI (1日あたりIPあたり10000を上限とする)への呼び出し数を最小限に抑え、一般的に責任のある市民になるために、ネットワークから受信した情報をキャッシュしてメモリに保存し、再びアクセスされます。この情報を格納するためのデータ構造について、私は本当に行き詰っています。 明らかに、これはリストになります。ただし、他のデータ構造と同様に、どのデータが格納され、どのようにアクセスされるかによって、選択を決定する必要があります。何、このようなすべての情報をなどの単一の記号に格納できるようにしたいのstack-api/cacheですが。だから、さらなるstack-api/cache騒ぎなしで、最後の更新によってキー付けされたconsesのリストです: `(<csite> <csite> <csite>) どこに<csite>なるでしょう (1362501715 . <site>) この時点では、単純な関連リストを定義するだけです。もちろん、もっと深く行く必要があります。 それぞれ<site>がAPIパラメータ(一意)のリストであり、その後に質問のリストが続きます。 `("codereview" <cquestion> <cquestion> <cquestion>) それぞれ<cquestion>が、あなたが推測したとおり、最後の更新時間に関する質問の短所です。 `(1362501715 <question>) (1362501720 . <question>) <question>question構造と回答のリストの短所です(ここでも、最終更新時間と見なされます)。 `(<question-structure> <canswer> <canswer> <canswer> そして ` `(1362501715 . <answer-structure>) Emacs Lispの(すべてのLispと大差ないが、あなたは知っていると愛このデータ構造は、おそらく最も正確ツリーとして説明しているが、言語を考慮し、これを行うには良い方法があるかどうかはわからないまったく) 。明示的なconsはおそらく不要ですが、それは私の脳がそれをよりよく包み込むのに役立ちます。<csite>たとえば、が次のようになるだけだと確信しています (<epoch-time> <api-param> <cquestion> <cquestion> ...) 懸念事項: このような潜在的に巨大な構造にデータを保存すると、システムのパフォーマンスが低下しますか?無関係なデータを保存しないようにしたいのですが、できる限りのことは行いましたが、データセットはそもそも(通常の使用のために)それほど大きくはないと思います。(私はリストの先頭にある時間を使用して古いデータをカリングすることを計画しています;それぞれはその子から最終更新時間を継承し、ツリーから継承します。このカリングが行われるべき範囲:私は承知しました。) このようなデータの保存には、データを使用する必要があるものとパフォーマンス上のトレードオフがありますか?つまり、セットとリトリーブ操作はリストのサイズの影響を受けますか? より良い構造がどのように見えるかについて他に提案はありますか?

4
データ構造を使用するアルゴリズムとデータベースを使用するアルゴリズムの違いは何ですか?
一般的な質問 データ構造を使用するアルゴリズムとデータベースを使用するアルゴリズムの違いは何ですか? いくつかのコンテキスト これはしばらくの間私を悩ませてきた質問であり、私はそれについて説得力のある答えを出すことができませんでした。 現在、もちろん、データ構造に深く関わるアルゴリズムの理解を深めることに取り組んでいます。これらは、バッグ、キュー、スタック、優先度キュー、ヒープなどの基本的な構造です。 また、データベースを日常的に使用して、エンドユーザーによって処理および送信された、またはプログラムによって処理されたデータを保存します。データベースのテーブルに基づいて生成される独自のデータ構造を持つDALを介して、データを取得して送信します。 私の質問は、データベースを使用してデータをソートして、昇順/降順で注文したデータを返送するか、データを取得してロジックにロードし、このデータを優先度キューで処理し、ヒープソートするオプションがあるときに発生しますそれのすべて。または、レコードのサブセットをロードするのではなく、データベースを使用してレコードを検索し、バイナリ検索のようなものを使用して、興味のあるレコードを見つけることもできます。 私の考えでは、通信は高価であるため、送信する前に、データベース側でできるだけ多くの操作を実行しようと思います。また、データベースのデータではなく、独自のロジック内で厳密に定義されたアルゴリズムとデータ構造を使用してデータを処理するのはいつですか。 だからここに質問があります... ご質問 データ構造とデータベースの違いは何ですか? データベースのロジックではなく、独自のロジック内でのみ定義されたデータ構造を使用するアルゴリズムをいつ使用しますか? @Harveyの投稿:データベース内のメソッドを使用すると、独自のロジック内のメソッドよりも効率が悪くなりますか? @mirculixxの投稿:メソッドを効率的にするものは何ですか? @Harveyポスト:データベースで行うよりもデータ構造でデータを処理する方が高速ですか? 明確化 @Grant post:私が通常使用するデータベースはリレーショナルであり、これらの質問はそれらを使用することから生まれています。ただし、これらの質問はどの永続フレームワークにも適用できると思います(フレームワークとは、最も一般的な意味での意味です)。 特定の文脈がないと答えが難しいことは知っています。考えられる食べ物、アドバイス、または議論のポイントは、主に私が探しているものであり、最もありがたいです!


4
半径内の家を見つける
インタビュー中に、次のことを尋ねられました。特定の距離内(たとえば、ユーザーが20マイル以内にあるすべての家を検索したい場合など)に現在市場に出ている(つまり、販売中の)すべての家をリストする不動産アプリケーション。このタイプのサービスを構築するために、アプリケーション(データ構造とアルゴリズムの両方)をどのように設計しますか? 何か案は?どのように実装しますか?地理関連のことをしたことがないので知らないと言った。

8
データベースに保存されているタスクの優先リスト
私は次のことをするための最良の方法を考えています: データベースに保存されているタスクのリストがあります。タスクには優先度が割り当てられています。タスクの優先度を変更して、実行する順序を並べ替えることができます。 Pivotal Trackerに非常によく似たものを考えています。 次のように想像してください。 1 Task A 2 Task B 3 Task C 4 Task D 5 Task E Eが最も重要なタスクであると判断します 1 Task E 2 Task A 3 Task B 4 Task C 5 Task D 5つのタスクすべてを更新して、新しい優先順位を付ける必要があります。 タスクBがより重要になると、AIは 1 Task E 2 Task B 3 Task A 4 Task C …

8
配列とスタックの違いは何ですか?
ウィキペディアによると、スタック: 後入れ先出し(LIFO)の抽象データ型と線形データ構造です。 一方で、配列: 要素(値または変数)のコレクションで構成されるデータ構造であり、それぞれが少なくとも1つの配列インデックスまたはキーによって識別されます。 私が理解している限り、それらはかなり似ています。では、主な違いは何ですか?それらが同じでない場合、配列がスタックでできないこと、およびその逆ができることは何ですか?

2
関数型言語の2次元ボードゲームのデータ構造
関数型プログラミング言語ElixirでシンプルなMiniMax実装を作成しています。多くの完全な知識のあるゲーム(三目並べ、コネクトフォー、チェッカー、チェスなど)があるため、この実装は、これらのゲームのゲームAIを作成するためのフレームワークになる可能性があります。 しかし、私が直面している問題の1つは、関数型言語でゲームの状態を適切に保存する方法です。これらのゲームは、主に次の操作が頻繁に行われる2次元ゲームボードを扱います。 特定のボードの場所の内容を読む 特定のボードの場所の内容を更新する(新しい移動の可能性を返すとき) 現在の場所に接続されている1つまたは複数の場所のコンテンツを考慮する(つまり、次または前の水平、垂直、または対角の場所) 任意の方向に接続された複数の場所のコンテンツを検討します。 ファイル全体、ランク、対角線の内容を考慮します。 ボードを回転またはミラーリングする(既に計算されたものと同じ結果が得られる対称性をチェックするため)。 ほとんどの関数型言語は、多要素データ構造の基本的なビルディングブロックとしてリンクリストとタプルを使用します。しかし、これらは仕事のために非常にひどく作られたようです: リンクされたリストには、O(n)(線形)ルックアップ時間があります。また、ボードを1回スイープして「ボードをスキャンして更新」することはできないため、リストを使用することは非常に非現実的です。 タプルのルックアップ時間はO(1)(一定)です。ただし、ボードを固定サイズのタプルとして表すと、ランク、ファイル、対角線、または他の種類の連続する正方形を反復処理することが非常に難しくなります。また、ElixirとHaskell(どちらも知っている2つの関数型言語)には、タプルのn番目の要素を読み取るための構文がありません。これは、任意のサイズのボードで機能する動的ソリューションを作成することを不可能にします。 Elixirには組み込みのMapデータ構造(およびHaskellにはData.Map)があり、要素へのO(log n)(対数)アクセスを許可します。現在、私はマップを使用し、x, yキーとして位置を表すタプルを使用しています。 これは「うまくいく」が、このようにマップを乱用することは間違っていると感じますが、理由は正確にはわかりません。2次元ゲームボードを関数型プログラミング言語で格納するためのより良い方法を探しています。

1
複雑な作業スケジュールのモデリング
私が表現して自動化しようとしている現実の問題があります。私はそれを次のように簡略化して抽象化しました: nの作業場所があります(P1、P2、...、Pn)。 各場所、Pnにはキー、Knがあります。 ワーカーがm人います(W1、W2、...、Wm)。 Pnで働くためには、労働者はKnを持たなければなりません。 各キーは、労働者が保持するか、取引所Eに残しておくことができます。 ワーカーはいつでもExchangeにアクセスして、要求されていないキーを取得したり、他のユーザーが使用できるようにいくつかのキーをドロップしたりできます。 現在、厳格な順序で完了する必要がある外因性の作業スケジュールがあります。例えば: 2016-04-21 W1はP6で働く必要があります 2016-04-21 W2はP3で働く必要があります **鍵の交換が必要です** 2016-04-22 W3はP3で働く必要があります 2016-04-22 W2はP6で働く必要があります 同じ日に決してではないが、スケジュールのある時点でPnで働く必要のある労働者はいくつもいる可能性がある 私たちは知っています: すべてのキーの開始場所(労働者またはEのいずれか) 各ワーカーが満たす必要がある将来の作業指示 それで、私はこの全体の状況をモデル化するのに苦労しています。データ構造とアルゴリズムを提案して、それを把握し、各ワーカーのエクスチェンジへのトリップの最適化を開始するために検討する必要がありますか? 私が最小限にしたいのは、Eへの旅行の総数です。2番目の目標は、労働者が不釣り合いな数の旅行をしないようにすることです。 前もって感謝します!!

1
銀行は実際にお金のデータ型として何を使用していますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 私はいくつかの良いオプションを知っています: セントまたは10 -nセントを表す大きな整数(int64_t、mpz_t、任意のbignum libなど)-たとえば、整数はペニーの1/100を表します($ 1.05 == 10500)。これは、スケーリングされた整数と呼ばれます。 JavaのBigDecimal、PythonのDecimal、JavaScriptのdecimal.js、C ++のboost :: multiprecision などの任意精度の10進数演算用の高レベルライブラリ 文字列。 パックBCD(2進化10進数)は、より難解な方法で、古いソフトウェアでは一般的でした。それについてもっと読んでください 。 銀行(またはクレジットカード、ATM、POSシステム)の量産コードで、実際に最も使用されているデータタイプはどれですか。特に銀行に勤めた方にお願いします。 編集:同じ問題ドメインを持つ人々にとって非常に便利なリンク(壊れない「お金」のデータ構造を実装する必要がある)。 http://martinfowler.com/eaaDev/quantity.html http://www.codeproject.com/Articles/28244/A-Money-type-for-the-CLR http://c2.com/cgi/wiki?MoneyObject http://www.setfiremedia.com/blog/7-top-tips-for-coding-with-currency http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html これは重複する質問であると言ったフェローのためのEDIT:これは、「何が最良か」の理論的な質問ではなく、実際的な質問です。私の質問の未編集のタイトルを読んでください。銀行のコードベースで人々が直接目にしたものを尋ねています。 BigDecimalが「最高」であることは明らかですが、そのような素晴らしいAPIはどこでも利用できるわけではなく、信じられないかもしれません。また、10進数ライブラリはintとは対照的に高価です。

4
このデータを保存する最も効率的な方法は何ですか?
私はいくつかの古いVBコードの書き換えを担当しています。私はそれがどのように機能するかを理解していますが、彼らがしたことを行うためのはるかに効率的な方法があるように感じます。それが何なのかわからない。これは、データ要件の点で私がする必要があるものと本当に似ている不自然な例です。 ユーザーは、GUIで車のメーカー、メーカー、モデル、色を選択する必要があります。次のような大きなテキストファイルがあります。 Ford Truck F150 red Ford Truck F150 blue Ford Truck F150 black Ford Truck F150 silver Ford Truck F250 red Ford Truck F250 green Ford Sedan Taurus red Ford Sedan Taurus green Ford Sedan Taurus white Ford... ... Subaru SUV Forester blue Subaru SUV Forester red Subaru SUV …

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