回溯本质

回溯算法本质上是一种递归算法

一般用以解决下面的问题:

  • 组合问题:从n个数里按照某个规则找出k个数;
  • 切割问题:一个字符串按照一定的方法有几种切割方法;
  • 子集问题:n个数里有多少符合条件的子集;
  • 排列问题:n个数按照某种排列规则,有几种排列方法;
  • 棋盘问题:n皇后等等;

解决过程

回溯的问题都能使用树形结构来解决,就是在树形结构中进行递归查找,即:集合的大小构成了树的宽度,递归的深度就是树的深度。

递归一定是要有终止条件,所以回溯问题构成的树,一定是一个有限深度的树。

解决模版

回溯问题的解决模版:(回溯三部曲

  1. 确定回溯函数的返回值及参数;
  2. 回溯函数的终止条件;
  3. 回溯搜索的遍历过程;
1
2
3
4
5
6
7
8
9
10
11
12
13
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}

for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}

力扣实战

烹饪料理

欢迎各位勇者来到力扣城,城内设有烹饪锅供勇者制作料理,为自己恢 复状态。
勇者背包内共有编号为 0 ~ 4 的五种食材,其中 materials[j] 表示第 j 种食材的数量。通过这些食材可以制作若干料理,cookbooks[i][j] 表示制作第 i 种料理需要第 j 种食材的数量,而 attribute[i] = [x,y] 表示第 i 道料理的美味度 x 和饱腹感 y。
在饱腹感不小于 limit 的情况下,请返回勇者可获得的最大美味度。如果无法满足饱腹感要求,则返回 -1。
注意:
每种料理只能制作一次。

示例 1:

输入:materials = [3,2,4,1,2]
cookbooks = [[1,1,0,1,2],[2,1,4,0,0],[3,2,4,1,0]]
attribute = [[3,2],[2,4],[7,6]]
limit = 5

输出:7

解释:
食材数量可以满足以下两种方案:
方案一:制作料理 0 和料理 1,可获得饱腹感 2+4、美味度 3+2
方案二:仅制作料理 2, 可饱腹感为 6、美味度为 7
因此在满足饱腹感的要求下,可获得最高美味度 7

题目有点长,虽然题目整体难度不大,但还是有些注意点,我犯错了调试半天才发现。
结合前面的三部曲,

  1. 确定回溯函数的返回值及参数;
  2. 回溯函数的终止条件;
  3. 回溯搜索的遍历过程;

很快啊,我们就能确定返回值是一个 bestYummy(最大美味度 ,int数值),随着递归深入,不断更新这个 值。

ok, 参数的话我们把题目里的条件都用上,多传递是没啥问题的,后面再优化嘛。

除了函数里已经给的 参数,我们需要传递 yummy(累计美味度, int类型) , 当前料理的id

ok 三部曲 第一部 完成

遇到id 为 n(总料理数,cookbooks.length) 结束循环, limit被用完更新最大值
ok 三部曲 第二部 完成

遍历过程比较重要,想象一下我们的树形结构,每层的决策都是一个二分,就是做或不做,to do or not to do 这个料理,ok, 我们就用两行递归代码搞定。
第一行递归是 not to do,为啥不是 to do,好问题~
第二行是to do,搞定这个to do前 需要去把相关的值做个更新,用于递归参数传递。

ok 至此 三部曲 第三部 完成

需要注意的点是,(敲黑板)

  1. 第二部曲 中, 结束循环 和 更新最大值的代码先后顺序! 先更新再结束循环,否则最后一个料理如果是最优解的话就会错过~。~

  2. 第三部曲 中 递归传递的值发生更新的有 materials, yummy, id, limit, 需要注意的是materials的更新,它是一个数组,需要拷贝一份做修改,将修改的拷贝传入参数

apk解压工具apktool

缘起

看了一篇文章,让人去修改“有道云”的笔记背景、去广告、使用vip才能用的颜色等,还有这好事?那再也不用开会员了,虽然我也没开过。

于是按照他的说法找到有道云本地的安装目录,好家伙,已经不是当初的版本了,一看文章2020年写的,现在都是apk压缩文件了。

既然是压缩文件,肯定得 解压 后修改啊。

于是试了下自带的解压不行,于是找到了apktool这个工具,果然专业。

一看下载我就有点头疼,这tm的是要引用这么多依赖,没个一小时很难下载完,咱就是说果然专业。

开搞

下载完后我们找到我们的作案现场,准备施展一番拳脚。

mac的安装地址是在

好家伙,藏的挺深啊。

ok,我们那开始对它动刑解剖:

1
2
3
4
5
6
7
8
apktool d[ecode] [options] <file_apk>
-f,--force Force delete destination directory.
-o,--output <dir> The name of folder that gets written. Default is apk.out
-p,--frame-path <dir> Uses framework files located in <dir>.
-r,--no-res Do not decode resources.
-s,--no-src Do not decode sources.
-t,--frame-tag <tag> Uses framework files tagged by <tag>.

寄了,一顿操作猛如虎,输入就是一通堆栈报错

下次找个合适的apk解压再更新吧,google了也不知道这是啥问题

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
更多主题可以在 hexo主题中找到,个人喜欢简洁风格,所以当前博客主题用的是next,修改主题的方法我放在下面了。

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

修改主题

找到对应主题的github地址

1
git clone https://github.com/next-theme/hexo-theme-next themes/next

执行后next主题会放在themes目录下;

打开 Hexo配置文件_config.yml 修改 theme变量为 next

1
theme: next

一般主题一个月会更新一次,所以想要体验最新主题,可以cd 到next目录下,git pull即可。

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

函数

不定积分

有没有什么好的推理方法可以记忆三角函数的不定积分公式啊!!!
不喜欢死记硬背~~

$$
\sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}
$$

编写markdown

由于本自建博客都是用markdown去写,所以想写篇教程使用 VS + Markdown Preview Enhanced 插件完成,这款插件旨在让你拥有飘逸的Markdown写作体验。

语法

标题(这就是)

强调

这是 斜体字
这是 粗体
这是 粗体
这是 加粗斜体组合
这是 删除

列表

  • 编程语言
    • Java
      • 对象
        • Object
    • Python
      • 开发框架
        • flask
        • Django
      • 函数
        • print
    • Go

插入图片

熊猫人表情

Ctrl+Shift+P 输入Image Helper, 可以选择Image Helper插入

飞书20221202-172006

链接

财富密码

引用

人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。

分割线


我与上面切割了!

行内代码

用python打印一个helloworld怎么写?
是不是 Print("hello world") 才对。

代码块

1
System.out.println("hello world")
1
2
3
4
import {
"fmt"
}
fmt.printf("hello world")

显示代码行数

{.line-numbers}
1
2
3
function add(x,y){
return x+y
}

高亮代码行

{highlight
1
2
3
var x=1,y=2
c = add(x,y)
console.log(c)

TOC

我喜欢这个功能,ctrl+shift+P打开命令面板 输入Create Toc,选择后就可以创建了。

并且它是可以根据你更改内容自动更新的。

这个是被排除的标题 {ignore=true}

这个没有排除

任务列表

  • [x] 早饭吃了吗
  • [x] 中饭吃了吗
  • [ ] 学习了吗
  • [x] 晚饭吃了吗

表格

First Header Second Header
Cell1 Cell2
Cell3 Cell4

合并单元格 (需要在插件设置中打开 enableExtendedTableSyntax )

  • 行合并 (> 或者 empty)
  • 列合并 (^)
First Header Second Header

| Cell2
| Cell4

First Header Second Header
Cell1 Cell2
^ Cell4

Emoji

😄
🚗
😘
😍

标记

上标

30o

下标

H2O

脚注

Content [1]

缩略

The HTML specification
is maintained by the W3C.

标记

==我被标记了==

Admonition 告诫

!!! note this is the 告诫标题
这是告诫主体

数学

行内数学表达式 $ x^3 + y^3 = z^3 $

块表达式
$$
\sum_{n=1}^{100}n =?
$$

相关主题

在插件的设置中,我设置了预览的主题色和代码的背景色。整个设置内容非常多。详细的参考

写完发现有些不能在github page上正确解析呀, 数学公式不能展示有点遗憾。


  1. Hi! This is a footnote ↩︎

go语言

项目背景

之前一个同事写的一个项目使用的是go语言, 用go语言做后端,前端是一个简单的html表单页面,表单内容有,并发数、最大query数,测试链接地址(飞书在线文档地址excel表格)。这个充当了我们的回归测试工具,在每次发布前需要跑一下这个测试。看看准确率有没有下降。

为啥要用go

我觉得主要是用go写并发 比java方便,因为

基础语法怎么学

首先我是直接看的项目,没有像掌握一门语言那样从头开始看起。遇到不懂的写法就问gpt,很快就能读懂这个代码,并作出想要的修改。

使用go的感受

chatgpt

prompt

在用gpt的时候,prompt提示词很关键,上面的flowgpt就是专门为提示词做的一个社区项目,创始人就是想把大家的idea集中起来,做各种各样的template,大家互相分享交流学习。

还有这样的网站Awesome提示词,里面有个很有意思的prompt,
Act as a Python interpreter

1
I want you to act like a Python interpreter. I will give you Python code, and you will execute it. Do not provide any explanations. Do not respond with anything except the output of the code. The first code is: “print(‘hello world!’)”

接下来输入给gpt的就是各种各样的python代码,gpt会给出相应的输出结果,我试了一下结果很正确,然后让它切换到java编译器,在网上找了一些枯燥晦涩的java笔试题喂给他, 他第一道居然就答错了。 anyway, 在我们告诉他 you are wrong后,很快啊,它又generate了一段回复,这回它对了。

尽管它有时候第一次不能完美回答,但是它的出现给了我们很多idea,以前从未有过的, 就拿这层出不穷的prompt来说,确实集思广益了。有句话拿出来跟大家分享,有时候会问问题比知道答案更重要, 在gpt身上体现的淋漓尽致, 有时候不是它回答的不是我们想要的,而是我们问的不够好 不够完善。

template

我在flowgpt中建立了两个flow,可以看作就是模板吧。

我当时的需求是想用gpt给我生成一些语料 corpus

在NLP算法开发之前有大量的时间是需要标注语料的,当然有专门的digital marker来做这件事。也有一些工具可以做,但是最好的还是人工标注,以应对复杂的语言环境,反问啊,疑问啊,还有一些摸棱两可的句子,总之很复杂就是了。 但是简短的一些语义的泛化其实就有迹可循了。

例如我们要问 明天上海的天气怎么样?

一般的泛化说法就是

  1. 加前缀助词 帮我看看…
  2. 加尾缀词 …你知道吗
  3. 同义词的替换 明天换成明日,上海换成魔都等等
  4. 语句的倒装,天气怎么样在明天的上海。。这个例子可能不是特别好。。。。
  5. 中间加上一些词,不重要的。说不重要指的是不是实体词,或者准确点说是天气这个垂域不需要关心的实体词。

ok, 以上是我能想到的一些泛化说法了, 至于还有其他的让我来问gpt吧,因为规则都是人事先想好的,就像正则一样,只能产生规则内的一些说法,超出规则外的一些是我人脑短时间难以考虑到的。

ok,看看我在flowgpt建立的模板吧

1
我给你一个语料标注模版,例如,“请给我查一下上海下周一到下周三的天气”,标注结果为“请给我查一下[上海](poi)[下周一到下周三](time)的天气”。现在我给你一批语料,帮我按照这个规则去生成标注后的结果。

这里给出的一个模板就是我上面陈述的,但是又不止于天气,其实我可以问导航、电话、系统设置等方面的句子。
这里的标注只限于实体词的抽取了,NLU还有一步是要区分这个句子的意图 intent,也就是个分类模型, 这个也可以用gpt帮忙去做。

Learn English

有时候需要找一个人练习英语,口语的条件有点难得,但是文字的回复我们可以有啊,跟gpt学英语是再好不过的了。

ok, 就更新到这里吧,以后想起来继续写。

这个博客昨天刚知道怎么搭建,以前接触过wordpress,还有一个docsify ,感觉还是这个好用啊,哈哈哈。markdown用的还不太熟练,文本不够丰富,我觉得有必要多练习,以后就用这个记录学习,感悟点滴了。

0%