AutoComplete的字典建立和单词查找算法实现
2007-11-08 20:14
369 查看
//说明:使用有序链表实现,单词插入的复杂度和查找的时间复杂度均为O(n),
#include <windows.h>
#include <math.h>
#include <iostream>
#include <list>
#include <string>
#define ASSERT(x) if(!(x)){throw 0;}
void TRACE(const char *szFormat,
)
{
va_list l;
char s[1000];
va_start(l,szFormat);
vsprintf(s,szFormat,l);
OutputDebugString(s);
}
using namespace std;
typedef list<string> STRLIST;
//MS笔试题:AutoComplete字典的插入单词,和查找类似单词的实现
//说明:如果查询的单词长度小于等于当前单词,且strnicmp(两个单词,较短的长度)==0,则认为是类似单词
//用有序链表保存单词,测试成功
namespace Dictionary2
{
struct LISTNODE
{
char data[100];
LISTNODE *next;
};
BOOL InsertWord(LISTNODE *&root,const char *word)
{
int n=strlen(word);
ASSERT(n>0 && n<100);
if(!root)
{
root=new LISTNODE;
strcpy(root->data,word);
root->next=0;
return TRUE;
}
LISTNODE *p=root;
LISTNODE *p1=0; //前一个指针
while (p)
{
//cout<<(DWORD)p<<endl;
int n2=strlen(p->data);
int nm=min(n,n2);
int icmp=strnicmp(word,p->data,nm);
if(icmp<0 || (icmp==0 && n<n2))
{
break;
}
else if(icmp==0 && n==n2)
{
return FALSE;
}
p1=p;
p=p->next;
}
LISTNODE *p2=new LISTNODE;
strcpy(p2->data,word);
if (p1)
{
TRACE("插入到%s之后",p1->data);
p2->next = p1->next;
p1->next=p2;
}
else
{
//插入到跟指针出
p2->next=root;
root=p2;
}
return TRUE;
}
void Traverse(LISTNODE *root)
{
while (root)
{
cout<<root->data<<endl;
root = root->next;
}
}
void/*STRLIST*/ FindWord(LISTNODE *root,const char *word)
{
//STRLIST sl;
if (root)
{
int n=strlen(word);
LISTNODE *p=root;
LISTNODE *p1=0;
int step=0;
while (p)
{
int n2=strlen(p->data);
int nm=min(n,n2);
int icmp=strnicmp(word,p->data,nm);
if (icmp==0 && n<=n2)
{
//sl.push_back(p->data);
cout <<p->data <<endl;
}
else if(icmp<0)
break;
p1=p;
p=p->next;
}
}
}
void Test()
{
LISTNODE *root=0;
InsertWord(root,"abc");
InsertWord(root,"abcd");
InsertWord(root,"abcc");
InsertWord(root,"zxabc");
InsertWord(root,"a");
InsertWord(root,"ab");
InsertWord(root,"ac");
InsertWord(root,"cb");
InsertWord(root,"bc");
InsertWord(root,"bxs");
InsertWord(root,"ba");
InsertWord(root,"baa");
InsertWord(root,"bsxa");
Traverse(root);
char word[100];
strcpy(word,"ab");
cout<<"查找单词"<<word <<endl;
FindWord(root,word);
strcpy(word,"b");
cout<<"查找单词"<<word <<endl;
FindWord(root,word);
}
}
#include <windows.h>
#include <math.h>
#include <iostream>
#include <list>
#include <string>
#define ASSERT(x) if(!(x)){throw 0;}
void TRACE(const char *szFormat,
)
{
va_list l;
char s[1000];
va_start(l,szFormat);
vsprintf(s,szFormat,l);
OutputDebugString(s);
}
using namespace std;
typedef list<string> STRLIST;
//MS笔试题:AutoComplete字典的插入单词,和查找类似单词的实现
//说明:如果查询的单词长度小于等于当前单词,且strnicmp(两个单词,较短的长度)==0,则认为是类似单词
//用有序链表保存单词,测试成功
namespace Dictionary2
{
struct LISTNODE
{
char data[100];
LISTNODE *next;
};
BOOL InsertWord(LISTNODE *&root,const char *word)
{
int n=strlen(word);
ASSERT(n>0 && n<100);
if(!root)
{
root=new LISTNODE;
strcpy(root->data,word);
root->next=0;
return TRUE;
}
LISTNODE *p=root;
LISTNODE *p1=0; //前一个指针
while (p)
{
//cout<<(DWORD)p<<endl;
int n2=strlen(p->data);
int nm=min(n,n2);
int icmp=strnicmp(word,p->data,nm);
if(icmp<0 || (icmp==0 && n<n2))
{
break;
}
else if(icmp==0 && n==n2)
{
return FALSE;
}
p1=p;
p=p->next;
}
LISTNODE *p2=new LISTNODE;
strcpy(p2->data,word);
if (p1)
{
TRACE("插入到%s之后",p1->data);
p2->next = p1->next;
p1->next=p2;
}
else
{
//插入到跟指针出
p2->next=root;
root=p2;
}
return TRUE;
}
void Traverse(LISTNODE *root)
{
while (root)
{
cout<<root->data<<endl;
root = root->next;
}
}
void/*STRLIST*/ FindWord(LISTNODE *root,const char *word)
{
//STRLIST sl;
if (root)
{
int n=strlen(word);
LISTNODE *p=root;
LISTNODE *p1=0;
int step=0;
while (p)
{
int n2=strlen(p->data);
int nm=min(n,n2);
int icmp=strnicmp(word,p->data,nm);
if (icmp==0 && n<=n2)
{
//sl.push_back(p->data);
cout <<p->data <<endl;
}
else if(icmp<0)
break;
p1=p;
p=p->next;
}
}
}
void Test()
{
LISTNODE *root=0;
InsertWord(root,"abc");
InsertWord(root,"abcd");
InsertWord(root,"abcc");
InsertWord(root,"zxabc");
InsertWord(root,"a");
InsertWord(root,"ab");
InsertWord(root,"ac");
InsertWord(root,"cb");
InsertWord(root,"bc");
InsertWord(root,"bxs");
InsertWord(root,"ba");
InsertWord(root,"baa");
InsertWord(root,"bsxa");
Traverse(root);
char word[100];
strcpy(word,"ab");
cout<<"查找单词"<<word <<endl;
FindWord(root,word);
strcpy(word,"b");
cout<<"查找单词"<<word <<endl;
FindWord(root,word);
}
}
相关文章推荐
- Trie树的建立—查找字典中以特定字符串开头的单词数量(java实现)
- 单词字典中对兄弟单词查找算法(C++实现)
- 基于python的分词算法的实现(3) - 建立字典
- 详解常用查找数据结构及算法(Python实现)
- 算法 第四版 1.4.22 仅用加减实现的二分查找
- 算法代码实现之二分法查找,Golang(Go语言)实现
- 数据结构与算法——提供一个单词,在字典中找到它的兄弟
- 二分查找实现与算法分析
- 单链表的建立,查找,插入,删除,测长,打印,逆置操作实现
- 埃拉托色尼筛算法查找素数(动态内存实现)
- 【算法】计算一篇文章的单词数(C、Java语言实现)
- 算法数据结构C++实现7 - 同时查找最大值和最小值优化算法
- 漫谈递归:二分查找算法的递归实现
- 面试宝典_Python.常规算法.0003.用Python去实现一个扁平化的字典?
- 二分查找算法python实现
- 二叉排序树的构造、查找、插入及删除算法的实现(C++)
- 兄弟单词 — 两种算法实现
- 算法之二分查找(c++版实现+测试)
- 【数据结构作业一】写出顺序表的结构体类型定义及查找、插入、删除算法,并以顺序表作存储结构,实现线性表的插入、删除
- js实现常见的几种算法(数组去重、字符统计、二分查找等)