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

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

2
Haskellのインメモリデータストア
HaskellのWebサービスにインメモリデータストアを実装したい。STMモナドでトランザクションを実行したい。 Haskellを使ってハッシュテーブルをスチームググリングすると、これしか得られませんData. BTree. HashTable. STM.。モジュール名と複雑さから、これはツリーとして実装されていることがわかります。可変ハッシュテーブルの場合、配列の方が効率的であると思います。 STMハッシュテーブルに配列を使用しない理由はありますか?このスチームハッシュテーブルで何かを得ますか、IntMapそれともスチームリファレンスを使用するだけですか?

4
メモリ使用量の分析:JavaとC ++は無視できるか?
Javaで記述された整数オブジェクトのメモリ使用量は、C ++で記述された整数オブジェクトのメモリ使用量とどのように比較されますか?違いは無視できますか?変わりはない?大きな違いは?言語に関係なくintはintであるため、同じだと思います(?) 私がこれを尋ねた理由は、プログラムのメモリ要件がプログラマーが特定の問題を解決するのをいつ妨げるかを知ることの重要性について読んでいたからです。 私を魅了したのは、単一のJavaオブジェクトを作成するために必要なメモリの量です。たとえば、整数オブジェクトを考えてみましょう。私が間違っているが、Java整数オブジェクトが24バイトのメモリを必要とする場合は修正してください。 intインスタンス変数用に4バイト 16バイトのオーバーヘッド(オブジェクトのクラス、ガベージコレクション情報、同期情報への参照) 4バイトのパディング 別の例として、Java配列(オブジェクトとして実装されている)には48バイト以上が必要です。 24バイトのヘッダー情報 16バイトのオブジェクトオーバーヘッド 長さは4バイト パディング用に4バイト さらに、値を格納するために必要なメモリ これらのメモリ使用量は、C ++で記述された同じコードとどのように比較されますか? 以前は自分が書いたC ++およびJavaプログラムのメモリ使用量について気づいていませんでしたが、アルゴリズムについて学び始めた今、コンピューターのリソースに対する理解が深まっています。

13
キューの良い、簡単な例は何ですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 4年前休業。 ロックされています。この質問とトピックへの回答はロックされています。質問はトピックから外れていますが、歴史的に重要です。現在、新しい回答や相互作用を受け入れていません。 私はCS2(Java and data structures)を教えていますが、キューを教えるときに使用する良い例を思い付くのが困難です。私がそれらを使用する2つの主要なアプリケーションは、multithreadedメッセージパッシング(ただし、MTプログラミングはコースの範囲外です)ですBFS-style algorithms(そして、この期間の後半まではグラフを取り上げません)。 不自然な例も避けたいです。私が考えているほとんどのことは、実際にシングルスレッド方式で解決する場合は、キューではなくリストを使用するだけです。処理とディスカバリーがインターリーブされる場合(検索など)、または長さ制限のあるバッファー(最後のNアイテムを維持するなど)のような特別な場合にのみ、キューを使用する傾向があります。実用的な範囲で、私は生徒に実際のプログラムで実際に物事を行うための良い方法を教えるだけでなく、機能を披露するおもちゃだけではありません。 例として使用できるが、他の最小限の事前知識を必要とする、キューの優れたシンプルなアルゴリズムまたはアプリケーションの提案はありますか?

7
オブジェクト指向に必要な機能は何ですか?
言語またはライブラリが「オブジェクト指向」として定義されるために、言語またはライブラリが提供しなければならない機能とは正確には何なのかと思います。オブジェクト指向は、缶は、多かれ少なかれ、中に達成されることを何かである任意のまともな機能を備えた汎用プログラミング言語?それとも、オブジェクト指向プログラミングをサポートしていることを具体的に宣伝している言語でのみ達成できるものですか? たとえば、次のCコードを見てください。 SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE); SDL_FreeSurface( screen ); またはここで説明したコード。 さて、上記のコードは継承、ランタイムポリモーフィズム(?)、仮想関数などを使用していません。しかし、私にはほとんどOOPのようです。 オブジェクト指向は、オブジェクト、クラス、構造体など、プログラミング言語またはライブラリによって提供される特別なパターンや機能を必要としない、作成および破壊可能なデータ構造に基づくコードを単に記述しているのですか?

2
この研究分野は何ですか?
靴の再販業者のウェブサイトをデザインしている状況があるとします。彼らは異なるブランドと種類の靴を持っています、そしてもちろん、彼らは本当に良い検索機能を望んでいます。 したがって、靴にはさまざまな特性があります。サイズ、幅、性別、子供/大人などの排他的なプロパティを持つことができます。または、色などの非排他的なプロパティを持つことができます(靴には2つ以上の色がある場合があります)。「ドレス」や「カジュアル」など、一部のカテゴリは競合する可能性があります(靴はドレスシューズとスニーカーの両方にはなれません(この例では「コンフォート」ドレスシューズは無視))が、まだ競合していません「ドレス」や「ブーツ」などの他のもの(靴はドレスブーツの場合もあります)。排他的なプロパティは簡単にモデル化できますが、競合する可能性のあるプロパティはどうですか?これは集合論にとって問題でしょうか? 一般的に、このような応用コンピュータサイエンスは何と呼ばれますか?データモデリング、またはより具体的なもの?排他的プロパティや非排他的プロパティなど、より抽象的な哲学の原則に触れ、それらの原則がコード、データ構造、およびデータベーススキーマにどのように実装されているかを確認したいと思います。 私が話していることの良い例は、変更されたプレオーダーツリートラバーサルアルゴリズムです。これは、ネストされた階層的分類システムを作成するための優れた方法です。つまり、実際の組織の問題、つまりカテゴリがあり、その問題をモデル化するデータ構造があります。 この種のものについてどこでもっと知ることができますか?

2
制約付きのジョブキューを最適に設計するにはどうすればよいですか?
次の状況を考慮してください。 処理する必要のある多数の「ジョブ」を作成し、それらをキューに入れるプログラムがあります。 他のワーカープログラムで次の「ジョブ」を取得して、そのジョブを処理できるようにします。 各ジョブにはカテゴリがあります。 カテゴリはいくつあってもかまいません。 同じカテゴリの2つのジョブを別々のワーカーで同時に処理することはできません。 ワーカーは一度に1つのジョブを処理できます。 同じカテゴリの複数のジョブが同時に処理される可能性があるため、この状況では従来のキューは機能しませんが、これは許可されていません。 取得するジョブをワーカーに確認させ、そのジョブカテゴリに現在処理中の別のワーカーがあるかどうかを確認し、そうである場合は後で処理するためにジョブをキューに再送信します。これは、この問題を解決する非効率的な方法のようです。この問題を解決できるデータ構造または設計パターンはありますか? さらに説明が必要な場合は、お知らせください。


2
メモリにデータの複数のビューを保存するにはどうすればよいですか?
たくさんのモジュールがあります。これらのモジュールを、完全で重複しないさまざまなカテゴリに分類できます。例えば、3つのように表すことができるIDを持つカテゴリ、Animal、Vegetable、およびMineral。さらに、これらのカテゴリをサブカテゴリに分類します。サブカテゴリも、明確で完全であり、重複しません。例えば、のように表すことができるIDS Mammal、Reptile、Legume、Root、Rock、Gem。最後に、これらのカテゴリの下に、モジュール自体が存在し、例えばCat、Dog、Iguana、Bean、Quartz、Emerald、など これが私の一般的な使用例です: すべてのモジュールでさまざまなメソッドを呼び出す必要があります。 すべてのモジュールのすべてのデータの現在の状態のフラットスナップショットを取得する必要があります。 特定のカテゴリ(サブカテゴリではない)のすべてのモジュールでさまざまなメソッドを呼び出す必要があります。 既知のIDに基づいて、特定のモジュールでさまざまなメソッドを呼び出す必要があります。 これは、「何かをする」または「自分についてのデータを教えて」のいずれかです。 特定のカテゴリ(サブカテゴリではない)のすべてのモジュールに関する集約データを保存する必要があります。 このデータをどのように保存すればよいですか? 他のいくつかの関連する事実: カテゴリは実行時に確立されます そのため、最下位レベルのモジュールは共通のインターフェースを共有します。 いったん設定されると、それらはその特定の実行で変更されません-それらは設定ファイルのデータに基づいています。 これが私が現在していることです: を含むクラスがありますMap<Category, CategoryDataStructure>。このクラスは、要件#2で使用するためのデータの個別のCollection<Module> ビューも保持します。 CategoryDataStructureを介して、メソッドコールをチェーンに送信するチェーンされた委譲メソッドがありますSubCategoryDataStructure。 CategoryDataStructure 要件#5で使用される集計データも格納します。 それは機能しますが、正直なところかなり扱いにくいです。全体はステートフル/ミュータブルであり、変更が困難です。新しい動作を追加したい場合は、多くの場所に追加する必要があります。現在、データ構造自体にも多くのビジネスロジックがあります。委任方法。また、親データ構造は、特定のモジュールと必要に応じてその親データ構造、および必要に応じてその親のデータ構造を作成するために、多くのビジネスロジックを実行する必要があります。 どういうわけか、データ管理ロジックをデータ構造自体から切り離そうとしていますが、ネストが複雑なためです。ここに私が検討してきた他のいくつかのオプションがあります: シンプルなを作成し、Map<Category, Map<Subcategory, Module>>すべてのコードを配置して、その状態を別のクラスに保持します。これを行う際の私の懸念は要件#1と#2です。同じデータを表す2つの異なるデータ構造があるので、ビューの一貫性を保つのは困難です。 すべてをフラットなデータ構造で実行し、特定のカテゴリまたはサブカテゴリを探す場合は、構造全体をループします。

2
ORMで複雑な計算フィールドを処理する方法
私たちのAPIには、計算された値を持つデータベースから取得した後に(いわば)「装飾」する必要があるいくつかの中心的なデータ型があります。データベースは、CakePHP 3データベースレイヤーから大きく影響を受けたテーブル/エンティティダイナミックに従うORMを介してアクセスされます。テーブルオブジェクトは、データベースと、モデルオブジェクトインスタンスとして行を取り込んで渡すアプリケーションとの間の仲介として使用されます。したがって、データベースからデータを取得してそれらの行を返すだけでなく、返されたデータを実際に使用する前に前処理する必要があります。ここに私が何を意味するかをよりよく説明するために出てきたいくつかのユースケースがあります: オブジェクトには数値があり、ユーザーフレンドリーなラベルに変換されます(通常、これは純粋にクライアントに保持するロジックですが、ビジネスセキュリティ上の理由から、このデータの一部はサーバーにのみ保持する必要があります。エッジケース) オブジェクトには、最後に追加された評価から取得された関連する評価値が必要です このような計算値と保存された値の組み合わせに基づいて、複雑なスケジュールオブジェクトが構築されます 単独では、これらのいずれもmap()、返された結果セットに対する単純な操作で実際にかなり簡単に実行できます。同じことが複数の計算値が必要な場合にも当てはまります。必要に応じて、より多くのマップ操作を実行して、それらのフィールドを計算および追加できます。 とはいえ、このアプローチには2つの大きな欠点があります。 これは、これらの計算された値を操作するすべての場所で後処理の追加の手順を実行する必要があることを意味します。これは特にDRYではありません。 これらの変換の一部は、最初に実行される他の変換に依存しています。それ以外の場合は、操作できるデータがありません。 両方を処理するために、このコードをORMに移動し、ORMを変更して、インターフェイスが(外部で)データベース列を処理するのと同じ方法で計算された仮想フィールドにアクセスできるようにするのが最善のアプローチであると考えていました。内部的には、これらの仮想フィールドを変換関数にマップし、潜在的に必要な依存関係変換を内部的に決定して、2番目の問題を解決することができます。 (余談ですが、これにより、単純なハッシュではなく、返された行が実際のオブジェクトである必要がなくなるかどうか疑問に思っています。現在、各行は、フィールドデータセットが設定された新しいオブジェクトをインスタンス化しますが、すべての計算またはデータの変更はモデルの外に移動され、オブジェクトはプロパティのバッグになります-本質的に、それ自体の内部ロジックを持たないハッシュマップです。これは実際には悪いことではないかもしれません)

2
パーソナルアシスタントは通常どのように文を生成しますか?
これは、言語学分野におけるNLG研究の方向性に関するこの質問のフォローアップのようなものです。 Siri、Google Now、Cortanaなどのパーソナルアシスタントツールはどのように自然言語生成(NLG)を実行しますか?具体的には、文章テキスト生成部。私は、テキストを音声に変換する部分ではなく、テキスト生成部分だけに関心があります。 その情報がおそらく入手できないので、私はそれぞれがそれをどのように行うか正確に探していません。 その品質の文生成を実装するにはどのような設定が必要なのでしょうか。 データベースにはどのようなデータが必要ですか(高レベル)? 可能なすべての単語とその意味の辞書に加えて、注釈が付けられ、統計的に分析された多くの本/コーパスに辞書を追加する必要がありますか? それは実際に人々が自然な方法で話した(テレビ番組やポッドキャストなどから)録音をしてテキストに変換し、それを何らかの形で "システム"に追加することを必要としますか?(本当に「人間」のような文章を得るために) あるいは、彼らが使用している単純な構文ベースの文パターンだけがあり、巨大な意味論的「意味」データベースがないのですか?誰かが正規表現タイプのものをたくさん書いたところ。 そのような自然に書かれた人間のような文章に使用されるアルゴリズムは何ですか? 質問する理由の1つは、NLG分野がSiriやGoogle Nowなどが成し遂げていることを実行することは非常に遠いようだということです。では、彼らはどんなことをしているのでしょうか?(ちょうど文のテキスト生成部分)。

1
「スキップデルタ」はSVNに固有ですか?
SVNバージョン管理システムを作成した善良な人々は、「スキップデルタ」と呼ばれる構造を使用して、ファイルの変更履歴を内部に保存します。リビジョンは、以前のリビジョンに対するデルタとして保存されます。ただし、次のように、リビジョンNは必ずしもリビジョンN-1に対するデルタとして格納されるわけではありません。 0 <- 1 <- 2 <- 3 <- 4 <- 5 <- 6 <- 7 <- 8 <- 9 代わりに、リビジョンNはNf(N)に対するデルタとして格納されます。ここで、f(N)はNを分割する2の最大の累乗です。 0 <- 1 2 <- 3 4 <- 5 6 <- 7 0 <------ 2 4 <------ 6 0 <---------------- 4 0 <------------------------------------ 8 <- 9 (表面的にはスキップリストのように見えますが、実際にはそれほど似ていません。たとえば、スキップデルタはリストの真ん中に挿入をサポートすることに関心がありません。)詳細については、こちらを参照してください。 私の質問は次のとおりです。他のシステムはスキップデルタを使用しますか?SVNの前に既知/使用/公開されたデルタをスキップしましたか、それともSVNの作成者がそれを自分で作成しましたか?

4
ネストされたマップと結合キー
私が現在取り組んでいるプロジェクトでは、ユーザーの年齢(大人、子供など)に応じて3つの異なるタイプの価格がありました。したがって、DBには次のようなテーブルがありました。 PRICES type Amount A 20 B 15 C .. D .. 最初は4種類の価格しかなかったので、コードには次のようなものがありました。 Map<String, BigDecimal> prices = new HashMap<String, BigDecimal>(); キーは価格タイプでした。 最近、彼らはすべての価格タイプに3つのサブタイプを追加する新しいビジネスルールを追加したので、次のようになります。 PRICES type subtype Amount A 1 20 A 2 15 A 3 .. B 1 .. B 2 .. ... .. .. 次の2つのオプションのどちらが良いと思いますか、そしてその理由は? ネストされたマップ Map<String, Map<String, BigDecimal>> prices; …

2
親への参照を持つノードを持つツリーはまだツリーですか?
ツリー内の各ノードの親を参照する場合、(定義により)まだツリーはありますか? ウィキペディアの定義は次のとおりです。 コンピュータサイエンスでは、ツリーは広く使用されている抽象データ型(ADT)またはこのADTを実装するデータ構造であり、リンクされたノードのセットとして表される子のルート値とサブツリーを持つ階層ツリー構造をシミュレートします。

4
依存データ構造を最新に保つにはどうすればよいですか?
構文解析ツリー、抽象構文ツリー、および制御フローグラフがあり、それぞれが前のものから論理的に派生しているとします。原則として、解析ツリーがあれば各グラフを作成するのは簡単ですが、解析ツリーが変更されたときにグラフを更新する複雑さをどのように管理できますか?私たちはツリーがどのように変更されたかを正確に知っていますが、管理が難しくならない方法で変更を他のツリーにどのように伝播できますか? 当然ながら、依存グラフは最初のグラフが変更されるたびに最初から再構築するだけで更新できますが、依存グラフの変更の詳細を知る方法はありません。 現在、この問題を解決する方法は4つありますが、それぞれに問題があります。 従属ツリーのノードはそれぞれ、元のツリーの関連ノードを監視し、必要に応じて自身と元のツリーノードのオブザーバーリストを更新します。これの概念的な複雑さは困難になる可能性があります。 元のツリーの各ノードには、それに依存する従属ツリーノードのリストがあり、ノードが変更されると、従属ノードにフラグを設定して、従属ノードの親を含め、ダーティとしてマークします。ルートに。変更のたびに、依存グラフを最初から作成するアルゴリズムとよく似たアルゴリズムを実行しますが、クリーンノードをスキップして各ダーティノードを再構築し、再構築されたノードが実際にダーティノードと異なるかどうかを追跡します。これも注意が必要です。 元のグラフと従属グラフの間の論理的な接続を、おそらく宣言型言語を使用して設計された制約のリストのようなデータ構造として表すことができます。元のグラフが変更された場合、違反している制約と違反を修正するために依存ツリーをどのように変更する必要があるかを見つけるためにリストをスキャンするだけで、すべてデータとしてエンコードされます。 既存の依存グラフがないかのように、依存グラフを最初から再構築し、既存のグラフと新しいグラフを比較して、どのように変化したかを確認できます。違いを検出するために利用できるアルゴリズムがあることを知っているので、これが最も簡単な方法であると確信していますが、それらはすべて非常に計算コストが高く、原則として不要と思われるため、このオプションは意図的に避けています。 この種の問題に対処する正しい方法は何ですか?確かに、このすべてをほぼ簡単にするデザインパターンがなければなりません。この一般的な説明のすべての問題に対して適切な解決策があると便利です。このクラスの問題には名前がありますか? この問題が引き起こすトラブルについて詳しく説明しましょう。この問題は、プロジェクトの2つの部分がグラフを操作するたびにさまざまな場所で発生します。各グラフは、ソフトウェアの実行中に変化する同じものの異なる表現です。これはインターフェースのアダプターを作成するようなものですが、単一のオブジェクトまたは固定数のオブジェクトをラップする代わりに、任意のサイズのグラフ全体をラップする必要があります。 私がこれを試す度に、私は混乱して維持不可能な混乱に終わります。オブザーバーの制御フローは、複雑になると追跡が困難になる可能性があります。あるグラフを別のグラフに変換するアルゴリズムは、通常、レイアウトが明確で複数のクラスにまたがっていない場合に追跡するには十分な注意が必要です。問題は、元のグラフが変更されているときに、単純で単純なグラフ変換アルゴリズムだけを使用する方法がないように見えることです。 当然のことながら、通常のグラフ変換アルゴリズムを直接使用することはできません。ゼロから開始する以外の方法で変更に対応できないためです。代わりの方法は何ですか?おそらく、アルゴリズムは継続渡しスタイルで記述できます。この場合、アルゴリズムの各ステップは、ビジターのように、元のグラフのノードのタイプごとにメソッドを持つオブジェクトとして表されます。次に、さまざまな単純なビジターを組み合わせてアルゴリズムを組み立てることができます。 別の例:JPanelsとレイアウトマネージャーを使用して、Java Swingの場合と同じようにレイアウトされたGUIがあるとします。複雑なレイアウトマネージャーの代わりにネストされたJPanelsを使用することでそのプロセスを簡略化できるため、レイアウト目的でのみ存在し、それ以外の場合は無意味なノードを含むさまざまなコンテナーのツリーになります。ここで、GUIの生成に使用されたものと同じツリーがアプリケーションの別の部分でも使用されていると想定しますが、ツリーをグラフィカルにレイアウトする代わりに、抽象表現ツリーをフォルダーのシステムとして生成するライブラリーを操作します。このライブラリを使用するには、レイアウトノードを持たないバージョンのツリーが必要です。レイアウトノードを親ノードにフラット化する必要があります。 もう1つの見方:可変ツリーを操作するというまさにその概念は、デメテルの法則に違反しています。構文解析ツリーや構文ツリーが通常のように値である場合は、実際には法律違反にはなりませんが、その場合は何も最新の状態に保つ必要がないため問題はありません。それで、この問題はデメテルの法則に違反した直接の結果として存在しますが、ドメインがツリーまたはグラフの操作に関するものであるように思われる場合、一般的にどのようにそれを回避しますか? 複合パターンは、 1つのオブジェクトにグラフを回すとデメテルの法則に従うための素晴らしいツールです。ある種類のツリーを別の種類のツリーに効果的に変換するために複合パターンを使用することは可能ですか?抽象構文木や制御フローグラフのように機能するように、複合解析ツリーを作成できますか?単一責任の原則に違反せずにそれを行う方法はありますか?複合パターンは、クラスが彼らが触れるすべての責任を吸収する傾向がありますが、おそらくそれは戦略パターンと何らかの形で組み合わせることができます。

3
C ++でテーブルを保存する最良の方法は何ですか
C4.5アルゴリズムのわずかに変更されたバージョンを使用して、C ++で決定木をプログラミングしています。各ノードはデータセットの属性または列を表し、属性の可能な値ごとに子があります。 私の問題は、各ノードにサブセットを使用する必要があるため、行と列のサブセットのみを選択する簡単な方法が必要であることを念頭に置いて、トレーニングデータセットを格納する方法です。 主な目標は、可能な限り最もメモリと時間効率の良い方法で(優先度の高い順に)実行することです。 私が考えた最善の方法は、配列の配列(またはstd :: vector)またはそのようなものを持ち、各ノードにリスト(配列、ベクトルなど)または何かcolumn,line(おそらくタプル)を持つことですそのノードに有効なペア。 私はこれを行うためのより良い方法があるはずです、何か提案はありますか? 更新:私が必要なのは次のようなものです: 初めに私はこのデータを持っています: Paris 4 5.0 True New York 7 1.3 True Tokio 2 9.1 False Paris 9 6.8 True Tokio 0 8.4 False しかし、2番目のノードでは、次のデータが必要です。 Paris 4 5.0 New York 7 1.3 Paris 9 6.8 そして、3番目のノードの場合: Tokio 2 9.1 Tokio 0 8.4 しかし、最大数百の列を持つ数百万のレコードのテーブルがあります。 …

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