Tag: 程序设计
“回溯 = DFS + 剪枝” 是一个对回溯算法简明且直观的描述。要理解这一点,我们可以先拆解这个等式中的几个关键概念。 深度优先搜索 (DFS) DFS(Depth-First Search)是一种图或树的遍历算法,它从根节点开始,沿着一个分支深入到尽可能远的节点,直到达到叶子节点或无可拓展的节点,然后回溯到上一个节点继续搜索其他分支。这种搜索策略自然地适合解决需要遍历所有可能状态的问题,如组合、排列问题等。 剪枝/Pruning 剪枝(Pruning)是指在搜索过程中,提前排除不符合条件的分支,以减少计算量。剪枝的主要作用是在搜索的过程中,避免无谓的计算。通过某些条件判断,可以在尚未完全展开某些分支时就停止搜索,从而减少时间复杂度。例如,当我们知道一个分支肯定不会产生有效解时,可以提前终止该分支的搜索过程。 回溯算法/Backtracking 回溯算法可以看作是深度优先搜索DFS的一种特例或具体应用。它采用DFS的思想,在搜索的过程中尝试每一种可能的选择(通常是通过递归实现),并在发现某个选择不符合条件或已经无法产生有效解时,及时回退(即“回溯”),然后继续尝试其他选择。这种“试探—回溯”的过程就构成了回溯算法。 结合三者的理解 DFS 为回溯算法提供了基本的搜索框架,即从起点开始沿着一个分支深入探索; 剪枝 则是在DFS基础上增加的优化步骤,目的是减少无效状态的探索。 因此,“回溯 = DFS + 剪枝” 是对回溯算法的一种总结。它表明回溯算法不仅仅是简单的深度优先搜索,还通过剪枝来提升效率。剪枝使得回溯算法在解决很多问题时比单纯的DFS更加高效,尤其是在解空间很大的情况下,剪枝能够大幅减少计算量,从而使得问题求解变得可行。 例子:Alpha-beta 算法剪枝 Alpha-beta 剪枝可以看作是一种回溯算法,它通过剪枝技术增强了深度优先搜索算法。 …
apache 服务器将访问请求记录在 /var/log/apache2 中,因此我们可以分析这个日志文件来找出最后的几个请求。 下面解析 apache2 服务器日志,并逐行打印请求。它基于 BASH 命令:tail 和 awk。 #!/bin/bash NUMBER_OF_REQUESTS=50 LOG_FILES_PREFIX=/var/log/apache2/access tail -n $NUMBER_OF_REQUESTS $LOG_FILES_PREFIX* | awk -F'"' ' # 确保 IP 地址、请求和用户代理字段存在 $1 ~ /^+\.+\.+\.+/ …
Chrome插件版本v2在今年6月份之后就会被淘汰了,早在四年前(2020年12月份版本88),v3就已经被支持,Google给了超过3年的时候让开发者把v2版本迁移到v3。我一直很懒,手头上几个插件都还是v2,挑选了几个用户比较多的改了一下迁移到v3。 手头上有11个Chrome插件,只有一些已经迁移到了v3。 将 Chrome 扩展程序的 v2 Manifest 转换为 V3 所需的更改 大部分需要的改动都在 manifest.json。 manifest.json 是Chrome插件的配置文件: manifest_version 需要改成3 browser_action 需要重命名为:”action” web_accessible_resources 版本2: "web_accessible_resources": , 版本3: "web_accessible_resources": , "extension_ids": }], background/scripts 版本2: …
给定一个数独(Sudoku), 我们可以使用深度优先搜索算法(DFS), 迭代加深搜索算法(IDS)或广度优先搜索算法(BFS)来寻找可能的解. 反过来, 如果我们要设计一个算法来生成有效的数独, 我们需要澄清以下问题: 生成的数独(Sudoku)必须有可解状态吗? 是的 生成的数独(Sudoku)有多个解吗? 我们可以假设返回的Suduoku只有1个唯一解 生成的数独(Sudoku)的找解难度? 我们可以为此设置一个参数: 简单, 中等或困难 一共有6.671×10^21个有效的数独状态, 如果我们忽略旋转, 镜像状态等重复的状态, 这个数字就降到了5.4×10^9个状态. 我们可以随机生成一个由数字1-9填充的矩阵, 并检查它是否是有效的数独, 但这非常低效, 因为生成的矩阵极有可能不是有效的数独. 设计一个随机数独的算法 为了设计一个有效的算法, 生成一个随机的有效数独, 我们可以采用以下算法: 使用回溯(深度优先搜索)算法来生成一个具有随机性的有效完整数独. 例如, 我们可以随机选择数字, …
用苹果公钥创建一个x.509标准的公钥怎么做? 要创建一个X.509标准的公钥, 首先需要获取苹果公钥. 可以从苹果开发者网站上获取苹果公钥, 然后使用OpenSSL工具将其转换为X.509标准的公钥. 具体步骤如下: 从苹果开发者网站上下载苹果公钥, 并将其保存为.pem格式的文件. 使用OpenSSL工具将.pem格式的文件转换为X.509标准的公钥, 命令如下: openssl x509 -in apple.pem -out apple.cer -outform DER 将转换后的X.509标准的公钥保存为.cer格式的文件. Python创建x.509标准密钥代码示例 以下是使用Python创建X.509标准密钥的示例代码: from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization …
2020年12月10日
BASH, BASH, I.T., 小技巧, 技术, 折腾, 数码, 树莓派, 树莓派 Raspberry Pi, 硬件, 程序设计, 计算机, 资讯
我们很容易可以通过以下BASH脚本来显示当前树莓PI的温度和频率. #pi@raspberrypi:~ $ cat ./cpu_freq.sh #!/bin/bash temp=`head -n 1 /sys/class/thermal/thermal_zone0/temp | xargs -I{} awk "BEGIN {printf \"%.2f\n\", {}/1000}"` echo $((`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq`/1000)) MHz, $temp degrees 然后, 我们可以每3秒来显示这个信息: # 每3秒显示 while …
leetcode 网页的代码编辑器很好用, 有一个远程调试 Debugger 的功能, 只不过这个功能是需要付费才能使用的. 而且这个调试功能在比赛中是无法使用的. 其实我们只需要在代码里向 stdout 打印(变量), 运行代码就能在网页中看到值了 – 这样一来就可以很方便的调试程序了. 当您手边没有IDE时, 这是一种调试代码的好方法-有时我在iPad上参加每周的竞赛, 而我没有IDE, 也无法使用内置的leetcode调试器- 在这种情况下, 打印到标准输出是调试打印变量的唯一实用方法. 在此之前, 我只能更改代码并将变量作为调试技术返回-这种方式效率很低. 英文: Using the stdout to debug print the …