11

長い間(20年以上)プログラミングをしなかった後、私はそれに戻ろうとしています。私の最初の本当の試みは、スクラブル/ Words With Friendsソルバー/チーターです(定義を選択してください)。私はかなり良いエンジンを作りました、しかしそれは効率または優雅さの代わりに力ずくで問題を解決します。多くの調査の結果、この問題に対する最善の答えはDAWGまたはCDWAGであることがかなり明らかです。そこでいくつかのC実装を見つけ、それらを活用することができました(同じデータセットの検索時間は1.5秒から.005秒になりました)。

しかし、私は純粋なObjective-Cでこれを行う方法を理解しようとしています。それで、私もそれをARCに準拠させようとしています。そして、iPhoneには十分効率的です。私はかなり調べて、そこにいくつかのデータ構造ライブラリ(つまりCHDataStructures)を見つけましたが、それらはほとんどC / Objective-Cハイブリッドであるか、ARCに準拠していません。それらは構造体に非常に大きく依存しており、構造体の内部にオブジェクトを埋め込みます。ARCはそれを本当に気にしません。

だから-私の質問は(申し訳ありませんが、これがtl; drであったかどうか、そしてそれがまったく新しい質問のように思われる場合-まだこのオブジェクトについて頭を悩ませることはできません)古典的なデータ構造(ツリーなど)をどのようにプログラムしますかObjective-Cで最初から?NS [Mutable] {Array、Setなど}に依存したくありません。DAWGを作成しているときに、ツリーなどの単純で基本的な実装を持っている人はいますか?

4

1 に答える 1

3

歩き始める前に、なぜ自分の足を撃つのですか?

あなたはあなたがいると言います

純粋なObjective-Cでこれを行う方法を理解しようとしています

まだあなた

NS[Mutable]{Array,Set,etc} に依存したくない

また、ARCを使いたいですか、それとも使いたくないですか。Objective-C に固執する場合は ARC を使用します。Foundation コレクションを使用したくない場合は、おそらく ARC を使用しない方がよいでしょう。

私の提案: NS[Mutable]{Array,Set,etc} を使用して、基本的なアルゴリズムを ARC で動作させるようにしてください。それが最初で唯一の目標であるべきです。他のすべては時期尚早の最適化です。特に、可能な限り最速の Scrabble アナライザーとソルバーを作成するのではなく、「プログラミングに戻る」ことが目標である場合。後で最適化が必要であることがわかった場合は、ボトルネックを分析できる実用的なコードがいくつかあります。必要に応じて、Foundation コレクションを置き換えることもできます。

ARC と互換性のない他のライブラリについては、 ARC によって設定されたいくつかのルールに従えば、かなり簡単に互換性を持たせることができます。それが価値があるかどうかは、サードパーティのコードベースのサイズに大きく依存します。

特に、void* から id へのキャスト、またはその逆のキャストには、ブリッジ キャストが必要なので、次のように記述します。

void* pointer = (__bridge void*)myObjCObject;

同様に、C 構造体のすべてのポインターにフラグを立てる__unsafe_unretainedと、C コードをそのまま使用できるはずです。さらに良いことに、C コードを静的ライブラリとしてビルドできる場合は、ARC をオフにしてビルドでき、いくつかのヘッダー ファイルを修正するだけで済みます。

于 2011-10-24T21:28:05.930 に答える