变位词问题

  变位词问题:给定一个英语字典,找出其中的所有变位词集合,例如,"pots","stop"和"tops"互为变位词,因为每一个单词都可以通过改变其他单词中字母的顺序来得到。
  如果考虑单词中字母的所有可能排列,那算法会出奇的低效和复杂。实际上,每个变位词相当于一个等价类。算法的关键是要选择一个标识来标识这个等价类,使得在相同变位词类中的单词具有相同的标识。然后,将所有相同标识的单词集中在一起。我们可以使用基于排序的标识(可见要使用排序技术),将单词中的字母按照字母表排序。例如上面标识即为opst。
  可以用三个程序来,通过协同工作来实现,第一个程序用来标识单词,第一个程序排序标识后的文件,第三个将这些单词压缩为每个变位词类占一行的形式。运行时让这三个独立程序用
管道连接,即可完成处理过程。
  (1)sign程序:为单词建立标识。假定文件中没有超过一百个字母的单词,并且输入文件仅包含小写字母和换行符。

  (2)sort程序:对标识后的文件排序。可以使用Linux/Unix中现成的sort程序。
  (3)squash程序:将所有单词压缩为每个变位词类占一行的形式。

  通过下面的命令构建变位词列表:sign <dictinary | sort | squash >gramilist。将文件dictionary输入到程序sign,经过处理最后输出到gramlist文件。
  这里通过使用标识这种数据结构,使算法效率大大提高。可见好的数据结构设计可以将大程序缩减为小程序,可以节省时间和空间、提高可移植性和可维护性。数据的表现形式是程序设计的根本。常用的原则有:
  (1)使用数组重新编写重复代码。
  (2)封装复杂结构。当需要非常复杂的数据结构时,使用抽象术语进行定义,并将操作表示为类。
  (3)尽可能使用高级工具。如超文本、名字-值对、电子表格、数据库、特定领域的编程语言等,都是特定问题领域中的强大工具。
  (4)从数据得出程序的结构。在编写代码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。
  关键算法设计思想:排序策略、标识等价类、协同程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值