C構造の質問
単語とそれに対応する頻度のリストがあります。
word 10
the 50
and 35
overflow 90
このデータを構造体に保持するにはどうすればよいですか? 2 次元配列を使用する必要がありますか? また、それらを頻度でソートする必要があることに注意する必要があるため、ある種の配列を考えてqsortを適用しますが、整数を保持する必要があるため、char配列を使用する場合はキャストを行ったり来たりする必要があります
おそらく構造体:
struct WordInfo {
char *word;
int frequency;
};
次に、これらの構造体の配列を作成できます。
struct WordInfo words[128]; // whatever
最後に、次のようなコンパレータ関数を記述します。
int word_compare(const void *p1, const void *p2)
{
struct WordInfo *s1 = p1;
struct WordInfo *s2 = p2;
return s1->frequency - s2->frequency;
}
処理しようとしている文字列の最大文字数がわかっている場合は、構造内で配列および int データ型を使用することを意味します。
typded struct _data
{
char word[MAX_CHARS];
int freq;
}DATA;
...
DATA *d = malloc(sizeof(DATA) * n);
word
go for pointer charaterの最大文字数がわからない場合char *word;
。この場合、パフォーマンスに影響を与えるエントリごとにメモリ割り当てが発生し、断片化がさらに発生します。
小さなメモリを何度も割り当てるよりも、メモリのチャンクを一度に割り当てるほうがよいでしょうn
。
std::pair の配列を持つこともできます
次に、2 番目の要素に基づいて配列を並べ替える任意の並べ替えアルゴリズムを実行できます。たとえば、次のようになります。
std::pair myArray[サイズ];
次のような構造タイプを定義します
struct wordAndFrequency
{
char *word;
int count;
};
struct wordAndFrequency
次に、との配列を取りqsort
ます。
typedef struct Dict {
char *word;
int frequency;
} Dictionary;
この構造体オブジェクトの配列を作成し、ハッシュマップとして使用します。単語に出くわしたら、その単語がそこにあるかどうかを確認し、カウンターをインクリメントします。そうでない場合は、カウントを 1 としてこの単語を追加します。
Dictionary *dictionary=(Dictionary*)malloc(sizeof(Dictionary)*SIZE);