【問題描述】
查詢方式說明:查詢方式以1~4數字表示,每個數字含義如下:
1:在單詞表中以順序查詢方式查詢,因為單詞表已排好序,遇到相同的或第乙個比待查詢的單詞大的單詞,就要終止查詢;
2:在單詞表中以折半查詢方式查詢;
3:在單詞表中通過索引表來獲取單詞查詢範圍,並在該查詢範圍中以折半方式查詢。索引表構建方式為:以26個英文本母為頭字母的單詞在字典中的起始位置和單詞個數來構建索引表,如:
該索引表表明以字母a開頭的單詞在單詞表中的開始下標位置為0,單詞個數為248。
4:按下面給定的hash函式為字典中單詞構造乙個hash表,hash衝突時按字典序依次存放單詞。hash查詢遇到衝突時,採用鏈位址法處理,在衝突鍊錶中找到或未找到(遇到第乙個比待查詢的單詞大的單詞或鍊錶結束)便結束查詢。
/* compute hash value for string */
#define nhash 3001
#define mult 37
unsigned int hash(char *str)
unsigned int h=0;
char *p;
for(p=str; *p!='\0'; p++)
h = mult*h + *p;
return h % nhash;
【輸入形式】
單詞字典檔案dictionary3000.txt存放在當前目錄下,待查詢單詞和查詢方式從標準輸入讀取。待查詢單詞只包含英文小寫字母,與表示查詢方式的整數之間以乙個空格分隔。
【輸出形式】
wins 1 0 3314
wins 2 0 12
wins 3 0 7
wins 4 0 2
yes 1 1 3357
yes 2 1 10
yes 3 1 4
yes 4 1 1
【樣例說明】
wins在單詞字典中不存在,4種查詢方式都輸出結果0,順序查詢、折半查詢、索引查詢和hash查詢的單詞比較次數分別為:3314、12、7和2次(wins的hash位置與字典中physics和suggest相同)。
yes在單詞字典中存在,4種查詢方式都輸出結果1,順序查詢、折半查詢、索引查詢和hash查詢的單詞比較次數分別為:3357、10、4和1。
方法一
#include
#include
#include
#define nhash 3001
#define mult 37
struct node
;typedef
struct node *nodeptr;
typedef
struct node node;
intfind_first
(char key,
char dictionary[
21],int n)
;int
find_second
(char key,
char dictionary[
21],int n)
;int
find_third
(char key,
char dictionary[
21],int table)
;int
find_fourth
(char key,
char dictionary[
21],int n)
;unsigned
inthash
(char
*str)
;nodeptr searchnode
(nodeptr head,
char elem)
;nodeptr insertnode
(nodeptr head,
char elem)
;int
main()
i++;}
fclose
(in)
;scanf
("%s%d"
, key,
&way)
;switch
(way)
return0;
}int
find_first
(char key,
char dictionary[
21],int n)if(
strcmp
(key, dictionary[count]
)<0)
break
; count++;}
if(flag ==0)
return0;
}int
find_second
(char key,
char dictionary[
21],int n)if(
strcmp
(key, dictionary[mid]
)>0)
else}if
(flag ==0)
return0;
}int
find_third
(char key,
char dictionary[
21],int table)
if(strcmp
(key, dictionary[mid]
)>0)
else}if
(flag ==0)
return0;
}int
find_fourth
(char key,
char dictionary[
21],int n)
searchnode
(table[
hash
(key)
], key)
;return0;
}unsigned
inthash
(char
*str)
nodeptr searchnode
(nodeptr head,
char elem)
nodeptr insertnode
(nodeptr head,
char elem)
else
return head;
}
方法二
#include
#include
#include
#include
#define nhash 3001
#define mult 37
struct wl
wl[3501];
struct ind
wordlo[27]
;struct h
hb[3501];
char s[29]
, c;
int i, j, k;
void
insert
(char
*s,int j)
wordlo[t]
.n++
; wordlo[0]
.n++;}
unsigned
inthash
(char
*s)void
addhash
(char
*s)else
return;}
void
fwordlo
(char
*s,int way)
} step++
;break;}
case2:
elseif(
strcmp
(wl[m]
.word, s)
<0)
else
}break;}
case3:
elseif(
strcmp
(wl[m]
.word, s)
<0)
else
}break;}
case4:
t = t->next;
}break;}
}printf
("%d %d\n"
, flag, step)
;return;}
intmain()
while
(scanf
("%s"
, s)
!=eof
)return0;
}
buaaer? 單詞查詢樹
兩種方法 給出一些列號碼,若果任乙個號碼不在另乙個中充當字首,那麼這系列號碼是合理的輸出yes,否則輸出no 思路 標頭檔案中find函式的使用,按長度從小到大排列,那麼能當另乙個號碼字首的只能是前乙個當後乙個的字首,所以乙個乙個找 時間複雜度 o n include include include...
單詞查詢樹
一 概念 從上面的圖中,我們或多或少的可以發現一些好玩的特性。第一 根節點不包含字元,除根節點外的每乙個子節點都包含乙個字元。第二 從根節點到某一節點,路徑上經過的字元連線起來,就是該節點對應的字串。第三 每個單詞的公共字首作為乙個字元節點儲存。二 使用範圍 既然學trie樹,我們肯定要知道這玩意是...
單詞查詢樹
在進行文法分析的時候,通常需要檢測乙個單詞是否在我們的單詞列表裡。為了提高查詢和定位的速度,通常都畫出與單詞列表所對應的單詞查詢樹,其特點如下 1 根結點不包含字母,除根結點外每乙個結點都僅包含乙個大寫英文本母 2 從根結點到某一結點,路徑上經過的字母依次連起來所構成的字母序列,稱為該結點對應的單詞...