求电话本的算法,谢谢啦!

紫色动力 2011-03-23 01:14:33
想做个电话本的程序,把公司同事的电话号码都放上。类似手机上的号码查询,用名字拼音的第一个字母进行查询。比如输入"M",把姓氏拼音第一个字母是"M"名字全找出来。输入“MX”,把名字前两个字第一个拼音是“MX”的名字找出来,比如把“马小军”,“马小丽”等名字找出来。请问这个算法怎么写,万分感谢!!!!
...全文
248 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫色动力 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tangsun1227 的回复:]
算法珠玑里第一个例子
[/Quote]
请问和《编程珠玑》是一本书吗?
紫色动力 2011-03-24
  • 打赏
  • 举报
回复
谢谢!!
紫色动力 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tangsun1227 的回复:]
算法珠玑里第一个例子
[/Quote]
谢谢,我去找找这本书。
qq120848369 2011-03-23
  • 打赏
  • 举报
回复
#include<iostream>
#include <set>
#include <string>
#include <queue>
using namespace std;

typedef struct node
{
public:
node()
{
memset(table,0,sizeof(table));
}

public:
set<string> name;
node* table[26];
}Node;

typedef struct trie
{
public:
trie():count(0)
{
}

public:
Node root;
int count;
}Trie;

Trie* createTrie()
{
return new Trie();
}

Node* createNode()
{
return new Node();
}

bool insert(const char *code,const char *name,Trie *tree)
{
Node *cur=&tree->root;

while(*code!=0)
{
if(cur->table[*code-'a']!=NULL)
{
cur=cur->table[*code-'a'];
}
else
{
Node *next=new Node();
cur->table[*code-'a']=next;
cur=next;
}

++code;
}

if(cur!=&tree->root)
{
if(cur->name.count(name)!=0)
{
return false;
}

cur->name.insert(name);
return true;
}
else
{
return false;
}
}

Node* find(const char *code,Trie *tree)
{
Node *cur=&tree->root;

while(*code!=0)
{
if(cur->table[*code-'a']!=NULL)
{
cur=cur->table[*code-'a'];
}
else
{
return NULL;
}

++code;
}

if(cur!=&tree->root)
{
return cur;
}
else
{
return NULL;
}
}

void update(const char *code,Trie *tree)
{
Node *p=find(code,tree);

if(p)
{
queue<Node*> q;

q.push(p);

while(!q.empty())
{
Node *head=q.front();
q.pop();

for(set<string>::iterator iter=head->name.begin();iter!=head->name.end();++iter)
{
cout<<*iter<<endl;
}

for(int i=0;i<26;++i)
{
if(head->table[i]!=NULL)
{
q.push(head->table[i]);
}
}
}
}
}

int main()
{
Trie *tree=createTrie();
insert("liangdong","梁栋",tree);
insert("liangshen","梁神",tree);

char buffer[100]={0};
int i=0;

while(true)
{
while( (buffer[i++]=getchar())!='\n' )
{
}

if(buffer[i-1]==EOF)
{
break;
}

buffer[--i]=0;
system("cls");
cout<<buffer<<endl;
update(buffer,tree);
fflush(stdin);
}

return 0;
}



给你个简单例子,用我给的两个例子做测试即可。
qq120848369 2011-03-23
  • 打赏
  • 举报
回复
搜索:Trie树,可以极大的满足你。
tangsun1227 2011-03-23
  • 打赏
  • 举报
回复
算法珠玑里第一个例子
紫色动力 2011-03-23
  • 打赏
  • 举报
回复
输入第二个字母时再从第一次查找的结果中查找?以此类推?
紫色动力 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]
最简单,最裸的办法就是一个一个查找了。
因为通常来说电话本的数据量不会太大,几百的量级,

根据输入的字母,从电话簿的第一个名字开始查找,符合拼音就输出,不符合就跳过查找下一个。
[/Quote]
第输入一个字母就查一遍吗?
匚匚 2011-03-23
  • 打赏
  • 举报
回复
/*编程建立一通讯簿,存放有姓名、电话号码、住址,然后对通信簿进行查找、添加、修改及删除。*/
#include<stdio.h>
struct person
{
char name[8];
char tel[15];
char addr[50];
};

char filename[20];
FILE *fp;

void creat();
void output();
void search();
void append();
void modify();
void delete();

main()
{
int m;

creat();
while(1)
{
printf("\n\n添加,请按1");
printf("\n查找,请按2");
printf("\n修改,请按3");
printf("\n删除,请按4");
printf("\n输出,请按5");
printf("\n退出,请按0\n");
scanf("%d",&m);
if(m>=0&&m<=5)
{
switch(m)
{
case 1: append();
break;
case 2: search();
break;
case 3: modify();
break;
case 4: delete();
break;
case 5: output();
break;
case 0: exit();
}
printf("\n\n操作完毕,请再次选择!");
}
else
printf("\n\n选择错误,请再次选择!");
}
}


void creat()
{
struct person one;
long s1;

printf("\n请输入通讯簿名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\n不能建立通讯簿!");
exit();
}
fprintf(fp,"%-10s%-20s%-50s\n","姓名","电话号码","住址");
printf("\n请输入姓名、电话号码及住址(以0结束)\n");
scanf("%s",one.name);
while(strcmp(one.name,"0"))
{
scanf("%s%s",one.tel,one.addr);
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
scanf("%s",one.name);
}
fclose(fp);
}

void output()
{
struct person one;

if((fp=fopen(filename,"r"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
printf("\n\n%20s\n","通 讯 簿");
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
printf("%-10s%-20s%-50s",one.name,one.tel,one.addr);
}
fclose(fp);
}

void append()
{
struct person one;

if((fp=fopen(filename,"a"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
printf("\n请输入添加的姓名、电话号码及住址\n");
scanf("%s%s%s",one.name,one.tel,one.addr);
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
fclose(fp);
}

void search()
{
int k=0;
char namekey[8];
struct person one;

printf("\n请输入姓名:");
scanf("%s",namekey);

if((fp=fopen(filename,"rb"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
printf("\n\n已查到,记录为:");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
k=1;
}
}
if(!k)
printf("\n\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
}

void modify()
{
int m,k=0;
long offset;
char namekey[8];
struct person one;

printf("\n请输入姓名:");
scanf("%s",namekey);

if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
offset=ftell(fp);
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n已查到,记录为:");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
printf("\n请输入新姓名、电话号码及住址:");
scanf("%s%s%s",one.name,one.tel,one.addr);
fseek(fp,offset,SEEK_SET);
printf("%ld",ftell(fp));
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
}
else
printf("\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
}

void delete()
{
int m,k=0,flag;
long offset1,offset2;
char namekey[8], valid[4];
struct person one;

printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯簿!");
exit();
}
while(!feof(fp))
{
offset1=ftell(fp);
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n已查到,记录为");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
printf("\n确实要删除,按1;不删除,按0:");
scanf("%d",&m);
if(m)
{
fseek(fp,offset1,SEEK_SET);
fprintf(fp,"%-10s%-20s%-50s\n","","","");
}
}
else
printf("\n对不起,通讯簿中没有此人的记录。");
fclose(fp);
}

wei801516 2011-03-23
  • 打赏
  • 举报
回复
键值对哦。。。。map容器就可以了
pmars 2011-03-23
  • 打赏
  • 举报
回复
算法真的不用那么复杂,直接找就行了,数据量挺小的,只是功能上下功夫就好了吧!
wuyu637 2011-03-23
  • 打赏
  • 举报
回复
最简单,最裸的办法就是一个一个查找了。
因为通常来说电话本的数据量不会太大,几百的量级,

根据输入的字母,从电话簿的第一个名字开始查找,符合拼音就输出,不符合就跳过查找下一个。
内容概要:本文系统研究了基于动态三维环境下的Q-Learning算法在无人机自主避障路径规划中的应用,依托Matlab代码实现,深入剖析了强化学习在复杂、时变空间中实现智能决策的机制。研究构建了三维网格化状态空间模型,设计了合理的动作集合与奖励函数,充分考虑静态与动态障碍物的存在,使无人机能够通过与环境持续交互,自主学习规避障碍并趋近目标的最优策略。文章不仅展示了Q-Learning算法在路径规划中的具体实现流程,还涵盖了状态表示、策略迭代、收敛性分析等关键环节,并通过仿真实验验证了算法的有效性与鲁棒性,为智能体在动态环境中的自主导航提供了理论依据和技术参考。; 适合人群:具备人工智能、自动化、计算机科学或机器人学等相关专业背景,熟悉Matlab编程语言和基本的强化学习概念,从事无人机控制、智能导航、路径规划算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市峡谷、灾害现场等复杂动态三维场景中无人机的自主飞行与紧急避障;②作为强化学习解决实际路径规划问题的教学实例,帮助理解Q-Learning的核心思想、状态-动作值函数更新过程及探索-利用权衡策略;③为后续研究更先进的深度强化学习算法(如DQN、PPO)在无人机控制中的应用奠定基础和提供对比基准。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,通过调整学习率、折扣因子、探索率(ε-greedy)等超参数,观察其对算法收敛速度和最终路径规划质量的影响,并尝试修改环境复杂度(如增加障碍物密度或动态性)以评估算法的泛化能力。
内容概要:本文系统研究了三相逆变器逆变电路的闭环控制模型,基于Simulink平台构建完整的仿真系统,深入探讨闭环控制策略对逆变器输出电压、电流波形质量的调控作用。研究内容涵盖三相逆变器的基本工作原理、空间矢量脉宽调制(SVPWM)技术、电压外环与电流内环构成的双闭环控制架构设计、PI控制器参数整定方法,并通过仿真实验全面评估系统在阻性、感性及非线性负载条件下的动态响应特性、稳态精度以及抗负载扰动能力,从而验证闭环控制策略的有效性与鲁棒性。同时,文档关联了多项电力电子与新能源并网相关的仿真案例,凸显其在光伏发电、微电网并网、储能系统等实际工程应用中的重要价值; 适合人群:具备电力电子技术、自动控制理论基础知识,熟悉Simulink/MATLAB仿真环境,从事电气工程、新能源发电、智能电网等方向的科研人员、工程技术人员及研究生; 使用场景及目标:①掌握三相逆变器双闭环控制系统建模与仿真的完整流程;②深入理解电压电流双闭环控制的设计原理及其在提升电能质量方面的实现机制;③为光伏并网逆变器、储能变流器(PCS)、微网能量管理系统等实际项目的控制算法开发与性能验证提供理论依据和技术参考; 阅读建议:建议结合文中提及的Simulink仿真模型进行实操演练,重点关注控制器参数调节对系统稳定性与动态性能的影响规律,并进一步拓展学习如重复控制、PR控制、模型预测控制(MPC)等先进控制策略在逆变器中的应用与对比分析。
内容概要:本文围绕单相逆变器闭环逆变电路的PWM模型展开仿真研究,基于Simulink平台构建系统模型,重点探究闭环控制策略下脉宽调制(PWM)技术在单相逆变器中的应用。研究内容涵盖系统建模、控制器设计、反馈回路构建及PWM信号生成等关键环节,通过仿真分析逆变电路在闭环控制下的动态响应特性、输出波形质量与系统稳定性,旨在提升逆变器的输出精度、抗干扰能力与整体性能,为电力电子系统的设计与优化提供理论支撑与仿真验证依据。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事电气工程、新能源发电、电源系统开发等相关领域的科研人员及高校研究生。; 使用场景及目标:①应用于单相逆变电源、光伏并网系统、不间断电源(UPS)等电力变换设备的控制器设计与性能优化;②通过仿真掌握闭环控制与PWM调制技术的实现机制,深入理解PI控制器参数整定、反馈采样方式选择及系统稳定性调节方法,进而提升实际工程系统的动态响应与稳态控制精度。; 阅读建议:建议读者结合Simulink动手搭建模型,逐步调试控制器参数,重点关注闭环反馈结构、PI调节器设计与PWM调制模块的实现逻辑,同时可通过对比开环与闭环系统的输出波形,深入理解闭环控制对系统性能的提升作用,从而深化对逆变器控制原理的掌握。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧