前提・実現したいこと
Wikipediaの題名とカテゴリを用いてカテゴリから題名を出力するプログラムを作成したいです、
現在hashを使わずにソースを作成したのですが実行が遅いのでhashを使って高速にしたいです。
発生している問題・
hashで1つの題名に1つのカテゴリなら作成できると思うのですが
複数のカテゴリを付与する場合どのようにすればいいのでしょうか?
該当のソースコード・現状
ソースコード #include <iostream> #include <fstream> #include <stdlib.h> #include <string.h> using namespace std; // 機能:引数として渡されたカテゴリが割り当てられているページのタイトルを検索する // 引数:カテゴリ名 // 戻値:検索結果 タイトル1,タイトル2,...のような , で区切られた文字列 string search_page(string query) { ifstream f_data("data.txt"); string result = ""; string line; // data.txtから1行ずつ読み込み while(f_data >> line) { // 記事タイトルとカテゴリ(category1,category2,...)のデータに分割 int index = line.find(","); string title = line.substr(0,index); string c_str = line.substr(index+1); // カテゴリ列のデータからカテゴリを1つずつ取り出し(split) int n; for(int i=0; i <= c_str.length(); i=n+1 ) { n = c_str.find_first_of(",", i); if( n == string::npos ) { n = c_str.length(); } string cw = c_str.substr(i, n-i ); if(query == cw) { result += title+","; } } } f_data.close(); return result; } int main(int argc, char *argv[]) { ifstream fc_data("category.list"); string result; string line; // data.txtから1行ずつ読み込み while(fc_data >> line) { cout << line << " -> "; string result = search_page(line); if(result != "") { cout << result << endl; } cout << endl; } fc_data.close(); return 0; }
###改善版/ぐちゃぐちゃです
#include <iostream> #include <fstream> #include <stdlib.h> #include <string.h> #include<cmath> #define HashSize 1000; using namespace std; ///////////ここでカテゴリの複数化を図りたい struct cell { string name; // 記事 string categori; // カテゴリ struct cell *next; // 次のデータへのポインタ }; // ハッシュ表 struct hashhash { int size; // ハッシュ表の大きさ struct cell **table; }; // ハッシュ関数(keyのハッシュ値を返す) // 文字列の1文字ごとの文字コードを加算するハッシュ関数 int hash1(string key, int size) { unsigned int v=0; for(int i=0;i<key.length();i++) { v+=key[i]*pow(2,i); } return v%size; } /*--- ハッシュ表の初期化 ---*/ int initialize(struct hashhash *h, int size) { h->table=(cell**)new struct cell[size]; h->size=size; for(int i=0;i<size;i++) { h->table[i]=NULL; } return 1; } // データの追加 int add(struct hashhash *h, string name, string categori) { // 追加するデータのハッシュ値 int hash_value=hash1(name, h->size); // 接続するデータを格納する要素を生成 struct cell *temp; temp=new struct cell; temp->name=name; temp->categori=categori; // 要素をハッシュに追加(上書きで追加) temp->next=h->table[hash_value]; h->table[hash_value]=temp; return 0; } struct cell *search_tel(struct hashhash *head, string name) { int hash_value=hash1(name,head->size); struct cell *buf=head->table[hash_value]; while(buf!=NULL) { if(buf->name == name) { return buf; } buf=buf->next; } return NULL; } /*string search_page(string query) { ifstream f_data("data.txt"); string result = ""; string line; // data.txtから1行ずつ読み込み while(f_data >> line) { // 記事タイトルとカテゴリ(category1,category2,...)のデータに分割 int index = line.find(","); string title = line.substr(0,index); string c_str = line.substr(index+1); // カテゴリ列のデータからカテゴリを1つずつ取り出し(split) int n; for(int i=0; i <= c_str.length(); i=n+1 ) { n = c_str.find_first_of(",", i); if( n == string::npos ) { n = c_str.length(); } string cw = c_str.substr(i, n-i ); if(query == cw) { result += title+","; } } } f_data.close(); return result; }*/ int main(int argc, char *argv[]) { ifstream fc_data("category.list"); string result; string line; // data.txtから1行ずつ読み込み while(fc_data >> line) { cout << line << " -> "; string result = search_page(line); if(result != "") { cout << result << endl; } cout << endl; } fc_data.close(); return 0; }
試したこと
未だ初心者でhashを使うとよくわからなくなってしまいます
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/27 19:15