作业地址:http://coursera.cs.princeton.edu/algs4/assignments/boggle.html

作业难点:

1、如何保证求解速度,满分要求是求解速度 >= 0.5 * 参考速度,约在5000次/5s。

  1)最直观的算法思想:要明确查找单词即为对一个游戏板(board)上的一个顶点向8个方向进行深度优先遍历,在遍历过程中查找单词是否在词典中,将在词典中的单词记录保存下来。为顺利找出所有满足条件的单词,可以使用广度、深度优先遍历该顶点。重复遍历完所有顶点即可找出在词典中的所有单词。

  2)根据算法思想构建数据结构:游戏板-board[][]一个二维数组,构建词典使用教材提及的TST(三叉单词查找树)或者Trie(单词查找树),保存已找出的单词(因为按题目要求重复单词只保留一个)使用HashSet,遍历方法采用dfs(深度优先搜索)方法。

  3)根据dfs原理构建算法求解,使用marked[][]标记已访问的顶点,使用TST构建词典,求解速度约在2500次/5s,需要优化。

  4)为避免回溯过程中重复查找单词树,为TST新增一个hasPrefix(String key)函数(查找单词树中是否包含key前缀),返回TST的Node类型:root——未查找到,非root——查找到。因为返回的是Node,所以每次只需查找Node以后的枝叶即可,key也即board[i][j]的字母即可。此时,求解速度约在3500次/5s,需要优化。

  5)弃用TST,改用Trie构建词典,修改hasPrefix()函数为getNext(String key)函数,此时求解速度上次到6500次/5s,可以满分,离参考值还有一段距离。

  6)因为查找的过程中存在重复单词,所以在开始的时候使用HashSet来保存找到的单词,存在查找重复单词并将其重复插入的情况。为避免对重复单词进行多次处理,设置处理过的单词的val值为-1,并记录该节点的位置,将其保存下来,在处理的最后对节点的val进行恢复。没有了重复单词,也就不需要HashSet来保存查找到的单词,使用简单的链表来保存即可,保存单词的速度更快。此时求解速度可以上升到10000次/5s。

容易扣分点:

同作业难点。

部分代码:

1、数据结构:

    private Trie dict;private String[][] gameStr;private Bag<String> words;       // found wordsprivate Bag<Trie.Node> nodes;    // nodes of found wordsprivate static class Trie {private static int R = 26;   // Radix, English alphabetprivate static final int OFFSET = 'A';         public Node root;class Node {int val;Node[] next = new Node[R];}     }

2、getAllValidWords(BoggleBoard board):

    public Iterable<String> getAllValidWords(BoggleBoard board) {words = new Bag<String>();nodes = new Bag<Trie.Node>();int col = board.cols(), row = board.rows();  boolean[][] marked = new boolean[row][col];gameStr = new String[row][col];  for (int i = 0; i < row; i++)for (int j = 0; j < col; j++) gameStr[i][j] = representQ(i, j, board);for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {    Trie.Node pNode = dict.getNext(dict.root, gameStr[i][j]);if (pNode != null)dfs(board, marked, i, j, pNode, gameStr[i][j]);}}for (Trie.Node n : nodes)n.val = 1;return words;}private void dfs(BoggleBoard board, boolean[][] marked,int x, int y, Trie.Node pNode, String preStr) {  marked[x][y] = true;  String curStr;int xNeighbor, yNeighbor;Trie.Node queryNode;if (pNode.val == 1 && preStr.length() > 2) {words.add(preStr);nodes.add(pNode);pNode.val = -1;}for (int i = 0; i < XDELTA.length; i++) {xNeighbor = x + XDELTA[i];yNeighbor = y + YDELTA[i];if (validPos(xNeighbor, yNeighbor, board)&& !marked[xNeighbor][yNeighbor]) {queryNode = dict.getNext(pNode, gameStr[xNeighbor][yNeighbor]);if (queryNode != null) {curStr = preStr + gameStr[xNeighbor][yNeighbor];dfs(board, marked, xNeighbor, yNeighbor, queryNode, curStr);}}}marked[x][y] = false;}

View Code

转载于:https://www.cnblogs.com/notTao/p/6389629.html

普林斯顿算法课Part2第四周作业_Boggle相关推荐

  1. 「数据结构」普林斯顿算法课第二周作业

    「数据结构」普林斯顿算法课第二周作业 Algorithm I, Princeton 编程作业: Deques and Randomized Queues 思路 Deque.java Randomize ...

  2. 「数据结构」普林斯顿算法课第一周作业

    「数据结构」普林斯顿算法课第一周作业 Algorithm I, Princeton 编程作业: Percolation 思路 第一部分代码展示 第二部分代码展示 编程作业: Percolation P ...

  3. 普林斯顿算法课作业 part II 的python实现(四)Boggle

    Boggle 问题 思路 代码 结果 总结 问题 原问题网页:Boggle 问题大致描述如下: 有一个 4×44\times44×4 的方格图,每一个格子上标有一个英文字母,现要从中寻找出英文单词. ...

  4. 普林斯顿算法课作业的python实现(四)8 Puzzle

    8 Puzzle 问题 思路 代码 结果 问题 这一次的编程作业是完成一个类似于"华容道"的游戏--8 puzzle: 给定一个 N×NN\times NN×N 的网格图,其中有一 ...

  5. 普林斯顿算法课作业的python实现(三)Collinear Points

    Collinear Points 问题 思路 代码 结果 问题 这一次的编程作业是判断共线点. 问题大致描述如下: 给定平面上一些点,判断其中是否有四个及以上的点共线,把所有这些点找出来并连线.原题链 ...

  6. 中科院卜东波算法课第三题作业(dp)oj总结

    (开篇必读,我是个菜鸡,所以思考的问题都是属于比较低端的,大佬请直接关闭此页) 说在之前我真的菜,乃至于明显很简单的两道题我写了15个小时左右,我是真的菜,而且我现在很生自己的气.正常人自己手打代码估 ...

  7. AcWing基础算法课Level-2 第五讲 动态规划

    AcWing基础算法课Level-2 第五讲 动态规划 背包问题 AcWing 2. 01背包问题3018人打卡 AcWing 3. 完全背包问题2749人打卡 AcWing 4. 多重背包问题255 ...

  8. 学号20189220 2018-2019-2 《密码与安全新技术专题》第四周作业

    学号20189220 2018-2019-2 <密码与安全新技术专题>第四周作业 课程:<密码与安全新技术专题> 班级: 1892 姓名: 余超 学号:20189220 上课教 ...

  9. 算法第四版课后习题答案 西安电子科技大学 计算机学院 算法课

    来源于西电计算机15级学长学姐,算法第四版课后习题答案 西安电子科技大学 计算机学院   算法课. 再推荐一个好的看答案的地方,每一题都有,只是还没有更新完成. 地址:https://alg4.ike ...

最新文章

  1. 转 C++STL之string
  2. Ubuntu下常用但是我容易忘记的命令总结(未完待续)
  3. 一款能拖拉的winform树形控件
  4. Javascript元编程创建DOM节点
  5. 绝了,这18 个开箱即用的 Shell 脚本值得收藏
  6. H5之audio标签放音兼容所有浏览器方法
  7. linux中查看某个进程打开的文件数
  8. virtual void addChild(Node * child, int localZOrder)中ZOreder参数设置
  9. 插件五之滚动条jquery.slimscroll.js
  10. JAVA中toString方法的作用
  11. TrueCommand是什么
  12. 3DMax人物动画制作
  13. “只取一瓢饮”的读书
  14. 我的世界java版天空材质_我的世界:天空还能如此真实?四款天空效果对比!网友:我全都要...
  15. 利用阿里云服务器制作一个浪漫的表白网页
  16. BZOJ5011 [Jx2017]颜色(洛谷P4065)
  17. 美团配送php,PHP对接美团配送接口遇到的坑
  18. MOSFET管基本原理与应用
  19. flex布局以及实现垂直居中
  20. IDEA-Warring:Add Author to custom tags

热门文章

  1. rgb的颜色转换以及十六进制转为十进制的那些事
  2. Adobe Flash Player / 功能
  3. 网易云音乐评论 可视化分析
  4. vue中使用ECharts实现折线图和饼图
  5. 支撑压力(刀哥指标)
  6. 用计算机时的注意事项,计算机使用注意事项
  7. VUE使用JS-SDK实现微信分享好友功能(通过点击控件触发)
  8. 英语口语100之每日十句口语
  9. “拓维元”震撼发布,拓维信息软硬全栈国产自研战略再落一子!
  10. 推荐5款免费好用的chatGPT平台