基于线性表实现单词的词频统计与查找
时间: 2023-03-24 08:00:19 浏览: 81
线性表实现单词频率统计和查找。
线性表是一种数据结构,可以用来存储一组有序的数据元素,比如数组和链表。在单词频率统计和查找中,我们可以使用线性表来存储单词和它们出现的次数。具体来说,可以使用一个结构体来表示单词和它的出现次数,然后将这些结构体存储在一个数组或链表中。
在统计单词频率时,我们可以遍历文本中的每一个单词,并在线性表中查找该单词是否已经存在。如果单词已经存在,我们就将它的出现次数加一;否则,我们就将该单词加入到线性表中,并将它的出现次数设置为一。
在查找单词时,我们只需要遍历线性表,并查找与目标单词相同的结构体。如果找到了,就返回该结构体中的出现次数;否则,说明该单词没有在文本中出现过,返回零。
使用线性表实现单词频率统计和查找的时间复杂度为 O(n),其中 n 是文本中单词的总数。如果文本很大,这种方法的空间复杂度可能会比较高,因为需要存储所有的单词和它们的出现次数。
相关问题
能实现读取一篇英文文章基于线性表实现单词的词频统计与查找的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++)
通过线性表实现顺序查找和折半查找c++
顺序查找:
```c++
#include <iostream>
using namespace std;
int sequentialSearch(int arr[], int n, int target) {
for (int i = 0; i < n; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
int main() {
int arr[] = {2, 4, 6, 8, 10};
int n = sizeof(arr) / sizeof(int);
int target = 6;
int index = sequentialSearch(arr, n, target);
if (index == -1) {
cout << "未找到目标元素" << endl;
} else {
cout << "目标元素在数组中的下标为:" << index << endl;
}
return 0;
}
```
折半查找:
```c++
#include <iostream>
using namespace std;
int binarySearch(int arr[], int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {2, 4, 6, 8, 10};
int n = sizeof(arr) / sizeof(int);
int target = 6;
int index = binarySearch(arr, n, target);
if (index == -1) {
cout << "未找到目标元素" << endl;
} else {
cout << "目标元素在数组中的下标为:" << index << endl;
}
return 0;
}
```