一篇英文文章存储在一个文本文件中,分别基于线性表、二叉排序树和散列表的不同存储结构,实现单词词频的的统计和单词的检索功能。同时计算不同检索策略下的ASL,通过比较ASL的大小,对不同检索策略的时间性能做出相应的比较分析
时间: 2023-02-26 17:07:45 浏览: 134
根据线性表、二叉排序树和散列表的不同存储结构,可以实现对英文文章中单词词频的统计和单词的检索功能。为了比较不同检索策略的时间性能,可以计算出每种检索策略下的平均搜索长度(ASL),通过对比ASL的大小,来对不同检索策略的时间性能进行比较分析。
相关问题
一篇英文文章存储在一个文本文件中,然后分别基于线性表、二叉排序树和哈希表不同的存储结构,完成单词词频的统计和单词的检索功能。同时计算不同检索策略下的平均查找长度ASL代码
以下是基于线性表的单词词频统计和单词检索功能的代码:
```python
class Word:
def __init__(self, word):
self.word = word
self.freq = 1
class LinearTable:
def __init__(self):
self.table = []
def add_word(self, word):
for w in self.table:
if w.word == word:
w.freq += 1
return
self.table.append(Word(word))
def search_word(self, word):
for w in self.table:
if w.word == word:
return w.freq
return 0
file_name = "example.txt"
with open(file_name, "r") as f:
lt = LinearTable()
for line in f:
words = line.strip().split(" ")
for word in words:
lt.add_word(word)
freq = lt.search_word("example")
print("The frequency of 'example' is:", freq)
```
以下是基于二叉排序树的单词词频统计和单词检索功能的代码:
```python
class TreeNode:
def __init__(self, word):
self.word = word
self.freq = 1
self.left = None
self.right = None
class BST:
def __init__(self):
self.root = None
def add_word(self, word):
if self.root is None:
self.root = TreeNode(word)
return
cur = self.root
while cur:
if word == cur.word:
cur.freq += 1
return
elif word < cur.word:
if cur.left:
cur = cur.left
else:
cur.left = TreeNode(word)
return
else:
if cur.right:
cur = cur.right
else:
cur.right = TreeNode(word)
return
def search_word(self, word):
cur = self.root
while cur:
if word == cur.word:
return cur.freq
elif word < cur.word:
cur = cur.left
else:
cur = cur.right
return 0
file_name = "example.txt"
with open(file_name, "r") as f:
bst = BST()
for line in f:
words = line.strip().split(" ")
for word in words:
bst.add_word(word)
freq = bst.search_word("example")
print("The frequency of 'example' is:", freq)
```
以下是基于哈希表的单词词频统计和单词检索功能的代码:
```python
class HashTable:
def __init__(self):
self.table = {}
def add_word(self, word):
if word in self.table:
self.table[word] += 1
else:
self.table[word] = 1
def search_word(self, word):
if word in self.table:
return self.table[word]
else:
return 0
file_name = "example.txt"
with open(file_name, "r") as f:
ht = HashTable()
for line in f:
words = line.strip().split(" ")
for word in words:
ht.add_word(word)
freq = ht.search_word("example")
print("The frequency of 'example' is:", freq)
```
计算不同检索策略下的平均查找长度ASL,需要在每种数据结构的搜索函数中添加计算ASL的代码。例如,在线性表的搜索函数中,可以添加一个变量来记录查找过程中遍历的节点数,然后在函数返回之前计算ASL。
```python
class LinearTable:
def __init__(self):
self.table = []
def add_word(self, word):
for w in self.table:
if w.word == word:
w.freq += 1
return
self.table.append(Word(word))
def search_word(self, word):
asl = 0
for i, w in enumerate(self.table):
asl += 1
if w.word == word:
return w.freq, asl
return 0, asl
file_name = "example.txt"
with open(file_name, "r") as f:
lt = LinearTable()
for line in f:
words = line.strip().split(" ")
for word in words:
lt.add_word(word)
freq, asl = lt.search_word("example")
print("The frequency of 'example' is:", freq)
print("The ASL of the search is:", asl / len(lt.table))
```
在二叉排序树和哈希表中计算ASL也类似,只需要在搜索函数中添加遍历节点的计数器,并在函数返回之前计算ASL即可。
能实现读取一篇英文文章基于线性表实现单词的词频统计与查找的C语言代码
好的,以下是基于线性表实现单词频率统计和查找的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORD_LEN 50 // 单词的最大长度
#define MAX_WORD_NUM 1000 // 最多可以统计的单词数
// 定义一个结构体来表示一个单词及其出现次数
struct word_freq {
char word[MAX_WORD_LEN];
int freq;
};
// 判断一个字符是否为单词分隔符(这里只考虑了空格和换行符)
int is_word_separator(char c) {
return c == ' ' || c == '\n';
}
// 将一个字符串转化为小写字母
void to_lower_case(char *str) {
int i;
for (i = 0; str[i]; i++) {
str[i] = tolower(str[i]);
}
}
// 统计一个字符串中的单词频率
void count_word_freq(char *str, struct word_freq *freq_array, int *num_words) {
char *word_start, *word_end;
int i, j, len, found;
word_start = str;
while (*word_start) {
// 找到下一个单词的起始位置
while (*word_start && is_word_separator(*word_start)) {
word_start++;
}
// 如果到了字符串末尾,则退出循环
if (!*word_start) {
break;
}
// 找到下一个单词的结束位置
word_end = word_start + 1;
while (*word_end && !is_word_separator(*word_end)) {
word_end++;
}
// 将单词复制到一个新的字符串中,并将其转化为小写字母
len = word_end - word_start;
char *word = (char *)malloc((len + 1) * sizeof(char));
strncpy(word, word_start, len);
word[len] = '\0';
to_lower_case(word);
// 在已有的单词中查找该单词
found = 0;
for (i = 0; i < *num_words; i++) {
if (strcmp(freq_array[i].word, word) == 0) {
freq_array[i].freq++;
found = 1;
break;
}
}
// 如果没有找到,则将该单词添加到数组中
if (!found) {
if (*num_words >= MAX_WORD_NUM) {
printf("Error: too many words!\n");
exit(1);
}
strncpy(freq_array[*num_words].word, word, MAX_WORD_LEN);
freq_array[*num_words].freq = 1;
(*num_words)++;
}
// 释放空间
free(word);
// 将指针指向下一个单词
word_start = word_end + 1;
}
}
// 按照单词出现次数从高到低排序
void sort_word_freq(struct word_freq *freq_array, int num_words) {
int i, j;
struct word_freq tmp;
for (i = 0; i < num_words - 1; i++) {
for (j = i + 1; j < num_words; j++)