実際の状況で使用した最も複雑なデータ構造は何ですか?[閉まっている]


16

この質問の発端は、私が業界のいくつかの仲間の開発者と行った議論から生まれました。

多くの場所で、プロジェクトマネージャーは複雑なデータ構造について警戒しており、通常は標準ライブラリ/パッケージからすぐに使用できるものをすべて主張しています。一般的な考え方は、パフォーマンスが大幅に妨げられない限り、すでに利用可能なものを組み合わせて使用​​するようなものです。これにより、コードベースをシンプルに保つことができます。これは、外交官にとっては、「私たちは高い離職率を持ち、採用する新しいものはそれほど良くない」ことを意味します。

したがって、CSジャンキー向けのブルームフィルターやスキップリスト、スプレイツリーはありません。そこで質問があります(もう一度):あなたがオフィスで使用したり使用したりした最も複雑なデータ構造は何ですか?

現実世界のソフトウェアがどれほど優れているか/洗練されているかの感覚をつかむのに役立ちます。


他の人、または私たち自身によって書かれた?

私の本来の意図は、自己開発したものでしたが、それは質問に興味深い次元を追加すると思います。元の質問を編集しました。
-Fanatic23

複雑にするからといって、洗練されているわけではありません。Simpler = better always。
tp1

最も複雑なものは常にSTLから入手できました。複雑さは通常、型からではなく、ネストされたデータ構造から生じます。プロファイラーが文句を言わない限り、単純な構造=良い。
コーダー

不要な価値評価の場合は-1。私も同じように言うことができます:最近では、データ構造を自分で実装する場合、あなたは愚かで頑固です。データ構造を間違った方法で実装できると考える次の賢い子供にならないでください。
ピーターB

回答:


7

ルックアップにスキップリストを使用しました。私が働いている場所には標準的な実装があり、誰もがそれを使用することが奨励されています。IPアドレスを効率的に保存および取得するために、パトリシアの試みを使用しました。繰り返しますが、実装はすでに存在していました。


7

私はJava開発者です。Java Collection Frameworkは私の90%のデータ構造の問題を解決でき、他の10%は努力が必要です。専門家によって書かれた洗練された標準ライブラリを本当に理解すれば、ほとんどの場合に役立つと思います。

現実の世界では、複雑なデータ構造を維持することは困難です。コードの混乱を避けるため、トラブルをいくつかの小さなコードに分けます。それぞれの小さな問題は、Java Collection Frameworkによって解決できます。おそらく、このソリューションは最もスマートではありません(より多くのメモリと低速が必要です)が、機能し、保守が容易です。それはトレードオフです。

複雑なデータ構造を記述する必要がある場合は、教科書を取り上げます:)


4

私が仕事で使用した最も複雑なデータ構造はトライでした。しかし、それは20年前です。

産業用ソフトウェア開発の問題は、ほとんどの産業用プログラマーがコンピューターサイエンス(CompSci)卒業生ではないことです。したがって、CompSciの平均的な卒業生が当たり前のことと考えている手法は、パンとバターのプログラマーが維持するのが難しすぎると考えられています。

業界におけるCompSciの一般的な知識の欠如は深刻な問題です。たとえば、!(a!= 5 && b!= 3)やa == 5 ||などの表現を理解していない、会ったソフトウェア開発者の数を失いました。b == 3は論理的に同等です。デモルガンの定理を適用する方法を知っている人は誰でも、これらの式が論理的に同等であることを認識することができます。CompSci以外の卒業生のほとんどは、DeMorganの定理を聞いたことがない。実質的なコードベースを調査すると、負の論理部分式を否定する式の多くの出現が見つかります。否定された負の論理部分式を含むコードの可読性は、ほとんどの場合、これらの式を非否定形式に変換することにより改善されます。


5
「下」票を投じる人への私のアドバイスは、「下」票を投じた理由を示すコメントを追加することです。私は異なる意見を持つ人を扱うことができます。しかし、私が対処できないのはco病です。
ビットツイダー

2
@ bit-twiddler私は哲学の学位でDe Morganの定理を学びました。今私はCSをやっています、それは言及されていません。正直なところ、私はこれらの種類のことを、経験を積むことで最も得られる速記だと考えています。方程式を因数分解するときに使用する規則(および名前)を本当に覚えておく必要がありますか?私はあなたのことは知りませんが、暗記ではなく、私の前にあるものに基づいて解決します。論理式を変更する場合も同様です。
ルパートマッデンアボット

2
@Rupert:De Morganの定理は、通常、個別の数学およびコンピューター組織でカバーされています(どちらも米国で学部課程が必要です)。私は学部生としてコンピューターアーキテクチャ/システムソフトウェアに集中しました。デモーガンの定理は、デジタルロジックデザインで多用されています。低レベルのソフトウェア開発には、De Morganの定理を知ることが重要になる分野があります。たとえば、ブール命令の完全なセットを含まない最小限の命令セットコンピューターがあります。したがって、あるブール演算を別のブール演算から導出できる必要があります。
ビットツイダー

1
(続き)これは、ほとんどの非コンピューターサイエンス/コンピューターエンジニアリング/電気工学(コンピューターエンジニアリング集中)卒業生が完全に失敗するか、答えるのに非常に長い時間がかかるテストです。NAND(負)演算のみを前提として、次のブール演算を導出します:NOT、AND、OR、NOR、XOR、およびXNOR。De Morganの定理を知ることで、これらの6つのブール演算を簡単に導き出すことができます。デモーガンの定理は、デジタルロジックデザインで最も重要な定理です。
ビットツイダー

1
.....公平に言えば、多くの作業が中小企業向けの半ば評価されたRoRアプリを書く業界では、おそらく1000000000に1回くらいは、英語の単語「or」と「and」の意味を単に知るのではなく、論理ゲートとブール代数の概念。これらのことは、あなたがCSの仕事をしているのか、複雑なアルゴリズムや最適化を行っているのか、低レベルのプログラミングをしているのかを知るのに関係ないというわけではありませんが、プログラマーとして働いている大多数の人にとっては、役に立たない雑学です。
サラ

2

私はかつて、イベントベースのシミュレーション用にカレンダーキュー(O(1)優先度キュー)を作成しました。プロファイリングでは、既存のヒープがボトルネックであることが示されました。

また、約80000状態の有限状態マシンを含む製品をリリースしました。それを生成するためのコードは、控えめに言っても少々面倒でした。


2

ずっと前、銀河系で...アセンブラーのRTOSでKnuthの「バディバッファー」を使用するチームで働いていました。

また、1024 x 1024の世界で256世代のConwayのGame of Life。


1

特別なものはあまり使用していません。最初から二重にリンクされたリストになります。

あまりエキサイティングではありませんが、他の構造を使用しました。しかし、あなたの質問は最初から言った。


C ++では、それstd::listはであり、実際には複雑なことは何もありません。
マチューM.

@Mathieu std :: mapを使用すると、おそらくrbツリーが取得されます。
-aufather

1

財務データの一般的なリストを含むハッシュテーブルのツリー-質問すらしません。時々私はカウボーイだったらいいのにと思う。ああ、星空の下でのシンプルな生活...


「親愛なる神様」のメガネを外します。
レンジョセフ

1

数独ソルバーのダンシングリンクアルゴリズムのために、循環二重リンクリスト構造を最初から記述する必要がありました。ルービックキューブを設計するように感じました。構造全体は基本的にリストのリストであり、各ノードは他の4つのノードを指しています。


1
ブルートフォースバックトラッキングアルゴリズムは、データを入力するよりも速くパズルを解くため、数独ソルバーにとってはやり過ぎのように聞こえます。
ケビンクライン

3
@kevin、ダンスリンクは総当たり的なバックトラッキングアルゴリズムです-しかし、もっともらしいヒューリスティックです。
ピーターテイラー

ソリューションの総数を列挙したり、Sudokuに一意のソリューションが1つしかないことを主張したりする場合など、ヒューリスティックが必要です。
-ProdigySim

1

かつて、特殊なキャッシュに重み付きパス長ツリーを使用しました。それは楽しかった。また、malloc()交換用に独自のヒープ管理ルーチンを作成しましたが、多くの人がそれを行っています。


0

それを考えて、私が最初から行った最も「複雑な」データ構造は、二重にリンクされたリストに基づいた要素のネットワークをモデル化することです。しかし、私がシステムレベルのプログラミングを行っていたのは、何年も前のことです。

最近では、空想的なデータ構造はほとんど作成していません。そのほとんどは、テーブルに何を入れるかを決定するデータベースで発生します。おそらく、事前に計算された値、または関連するレコードのIDで、不要な検索を避けるための迅速な検索が可能です。

個人的には、目の前のタスクが手段を定義しているということです。使用しないのに、なぜいくつかのエキゾチックなデータ構造を利用しようと努力するのですか?そして、私が実際の応用プログラミングのほとんどで言うことができるなら、おそらく車輪を再発明する必要はないでしょう。


私の意図はエキゾチックなデータ構造を強制することではありませんでした。しかし、箱から出して何かを必要とし、企業ポリシーが指示しているという理由だけで既に利用可能なものを処理しなければならないときの悲しい状況です。
Fanatic23

0

優先キューはカウントされますか?これは、私が書いたほぼすべてのリアルタイムアプリケーションで発生します。最近になって標準Javaライブラリの一部になりました(Java 1.5)。

それ以外は、私が本当に望んでいた、ライブラリから引き出すことができなかった複雑なものは考えられません。私はそれを止めさせませんが、なぜライブラリを含めるにはあまりにもエキゾチックなデータ構造が必要なのか疑問に思うでしょう。自分で作成する前に、トライまたはブルームフィルター、またはスキップリストの既存のオープンソース実装を間違いなく探します。

一般に、ライブラリバージョンが存在しないほど難解なカスタムデータ構造の構築と保守のコストは、そこから得られるパフォーマンス上の利点を上回る可能性が高いことをマネージャーに同意します。プロファイリングを通じて、単純なライブラリ構造がパフォーマンスの大幅な低下を引き起こしていることを示してから、先に進んでそれらを空想的なもので最適化してもらいたいと思います。原則として、エンジニアリングサイクルよりもプロセッササイクルを購入する方が安価だからです。

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