竭尽全分求解!我的最后100分!!使用哈希表技术判断两个源程序的相似性!!!

mukai520 2005-06-27 06:17:53
@[问题描述]
对于两个C语言的源程序清单,用哈希表的方法分别统计两个程序中使用C语言关键字的情况,并最终按定量的计算结果,得出两份源程序清单的相似性。
@[基本要求]
C语言关键字的哈希表可以自建,也可以利用《数据结构及应用算法教程》(严蔚敏 陈文博编著 清华大学出版社)书中8。10的哈希表。此题的工作主要是扫描给定的源程序,累计在每个源程序中C语言关键字出现的频度。在扫描源程序过程中,每遇到关键字就查找哈希表,并累加相应关键字出现的频度。为保证查找效率,建议自建哈希表的平均查找长度ASL不大于2。
扫描两个源程序所统计的所有关键字不同频度,可以得到两个向量。如下面简单的例子所示:
Void Int For Char If Else while
4 3 4 3 7 0 2
4 2 5 4 5 2 1
关键字
程序1种关键字频度
程序2种关键字频度
哈希地址
0 1 2 3 4 5 6 7 8 9

X1=[4,3,0,4,3,0,7,0,0,2] X2=[4,2,0,5,4,0,5,2,0,1]
通过计算向量X1和X2的相对距离来判断两个源程序的相似性,相对距离的计算方法是
,T表示向量的转置。Abs
按例子所给的数据,s 0.13。显然当X1=X2时,s=0,反映出可能是同一个程序;s值越大,则两个程序的差别可能也越大。
@[测试数据]
做几个编译和运行都无误的C程序,程序之间有相近的和差别大的,用上述方法求s,并对比差异程度。
@[实现提示]
本题的很大工作量将是对源程序扫描,区分出C程序的每一关键字。可以为C语言关键字集建一棵键树,扫描源程序和在键树中查找同步进行,以取得每一个关键字。
@[问题讨论]
这种判断方法只是提供一种辅助手段,即便s=0也可能不是同一个程序,s的值很大,也可能算法是完全一样的。例如,一个程序使用while语句,另一个使用for语句,但功能完全相同。事实上,当发现s的值很小时,就应该以人工干预来区分。

这是我写的一段从文本文件中读取程序的代码:
———————————————————————————————
char shuzu1[500],shuzu2[500];
void fn()
{ int a=0,b=0,c=0;
char g[33]="F:\\a.cpp";
cin.get(g,33);
ifstream myf(g,ios::in);
while(!myf.eof())
{
shuzu1[c]=myf.get();
shuzu2[c]=shuzu1[c];
cout<<shuzu1[c];
c++;
}
shuzu2[c]=0;
cout<<shuzu2;

}
————————————————————————————————
初学数据结构,c++底子很薄,让我使用哈希表技术判断两个源程序的相似性太难了!
请大家提供解题线索,如果是完整代码就更好了!
诚谢各位!
...全文
440 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zora 2005-06-28
  • 打赏
  • 举报
回复
晕……乍看标题还以为是通过计算两个源程序的hash来比较,想来讨论一下其可能性。

仔细一看原来只是用hash表保存关键字个数,这个都是很基本的问题,建议还是自己仔细看看书,亲自动手做一做,真正把问题搞懂才是
hiiiiiijiang 2005-06-28
  • 打赏
  • 举报
回复
呵呵,帮你顶一哈子
mukai520 2005-06-28
  • 打赏
  • 举报
回复
明天中午就是最后期限了,自己顶,希望大家也顶
解解解解解解解解解解解解解解解解解解解
解解解解解解解解解解解解解解解解解解解
解解解解解解解解 解 解解解解解解解解
解解解解解解解解 解解 解解解解解解
解解解解解解解解 解解解 解解解解解解
解 解解解
解解解解解解解解 解解解解解解解解解解
解解解 解解解解 解解解 解解解解解
解解解解 解解解 解解 解解解解解解解
解解解解解 解解 解 解解解解解解解解
解解解解解解 解 解解解解解解解解
解解解解解 解解 解解 解解解解解解解
解解解解 解解解 解解解 解解解解解
解解 解解解解 解解解解 解解解
解解解解解解解解 解解解解解 解解解解
解解解解解解解解 解解解解解解解解解解
解解解解解解 解 解解解解解解解解解解
解解解解解解解 解解解解解解解解解解解
解解解解解解解解解解解解解解解解解解解
解解解解解解解解解解解解解解解解解解解
Visual Studio Code 是由微软开发的一款免费、开源、跨平台的现代化轻量级代码编辑器,自发布以来迅速成为全球开发者最受欢迎的工具之一。它结合了编辑器的轻便性和集成开发环境(IDE)的强大功能,支持多种编程语言和开发场景,核心特点: 1. 跨平台支持 可在 Windows、macOS 和 Linux 上运行,保持一致的用户体验。 2. 轻量级与高性能 启动速度快,占用资源少,适合处理大型项目或低配置设备。 3. 智能代码补全 内置 IntelliSense(智能感知),提供代码提示、参数信息、快速修复等功能,支持 JavaScript、TypeScript、Python、C++ 等主流语言。 4. 内置终端 直接在编辑器内打开集成终端(支持 PowerShell、CMD、Bash 等),方便执行命令行操作。 5. 调试工具 内置调试器,支持断点、变量监视、调用堆栈查看等,无需离开编辑器即可调试代码。 6. Git 集成 直接通过侧边栏管理 Git 仓库,支持提交、支切换、冲突解决等操作。 7. 丰富的扩展生态系统 通过 Extensions Marketplace 可安装数千款插件,扩展功能包括: 语言支持:如 Java、Go、Rust 等。 主题与图标:自定义界面风格。 工具集成:如 Docker、Kubernetes、数据库连接等。 效率工具:如 REST Client、Live Server 等。 8. 自定义与主题 支持修改键盘快捷键、界面主题、文件图标等,打造个性化开发环境。 9. 多光标编辑 按住 Alt(Windows/Linux)或 Option(macOS)点击可添加多个光标,同时编辑多处代码。 10. 远程开发支持 通过 Remote - SSH、Remote - Containers 等扩展,可直接连接远程服务器或开发容器,实现无缝协作。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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