东风草堂博客

公众号:开发者来风

动态规划是一种解决问题的算法策略,它通常用于解决涉及最优化问题的情况,比如找到最短路径、最大价值等等。动态规划算法的核心思想是将一个大问题分解成一系列小问题,并记住已经解决的小问题的答案,以避免重复计算。这种方法有助于提高计算效率。

动态规划的一般步骤如下:

  1. 定义问题: 首先,将大问题分解成小问题,并明确定义每个小问题的状态。这些状态是问题的不同方面,通常与问题的输入相关。
  2. 找到递推关系: 接下来,确定每个状态如何与其他状态相关联。这通常通过递推关系或方程式来完成,它们描述了一个状态如何由一个或多个先前状态计算得出。
  3. 初始化: 对于问题中的一些状态,需要初始化其初始值,以便递推关系可以开始工作。
  4. 计算和记忆: 使用递推关系,从最小的状态开始,逐步计算并记住每个状态的值。这些值可以保存在表格、数组或字典中,以便后续使用。
  5. 解决大问题: 通过计算小问题的值,最终可以解决整个大问题。这通常是在表格中找到最终状态的值,然后根据需要提取答案。
  6. 优化: 可能需要进一步优化算法以减少内存和时间的消耗。

买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

阅读全文 »

Table的管理

在Pegasus里,table相当于一个namespace,不同的table下可以有相同的(HashKey, SortKey)序对。在使用table前,需要在向MetaServer先发起建表的申请。

MetaServer在建表的时候,首先对表名以及选项做一些合法性的检查。如果检查通过,会把表的元信息持久化存储到Zookeeper上。在持久化完成后,MetaServer会为表中的每个分片都创建一条记录,叫做PartitionConfiguration。该记录里最主要的内容就是当前分片的version以及分片的composition(即Primary和Secondary分别位于哪个ReplicaServer)。

在表创建好后,一个分片的composition初始化为空。MetaServer会为空分片分配Primary和Secondary。等一个分片有一主两备后,就可以对外提供读写服务了。假如一张表所有的分片都满足一主两备份,那么这张表就是可以正常工作的。

如果用户不再需要使用一张表,可以调用删除接口对Pegasus的表进行删除。删除的信息也是先做持久化,然后再异步的将删除信息通知到各个ReplicaServer上。等所有相关ReplicaServer都得知表已经删除后,该表就变得不可访问。注意,此时数据并未作物理删除。真正的物理删除,要在一定的时间周期后发生。在此期间,假如用户想撤回删除操作,也是可以调用相关接口将表召回。这个功能称为软删除。

阅读全文 »

萝卜丝鲫鱼

  1. 鲫鱼改花刀,准备姜葱。
  2. 将萝卜丝加入白砂糖煮3分钟去除涩味。
  3. 加入油盐和姜,将鲫鱼放入锅中煎至两面金黄。
  4. 将煎好的鱼加入开水煮,煮至汤变白再加入盐、萝卜丝小火慢煮。
  5. 加入煎蛋提鲜。

炒菜

腊肉萝卜丝

阅读全文 »

稳定性与兼容性

断言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifdef NDEBUG
#define assert(expr) (static_cast<void>(0))
#else
#endif

#ifndef _COMPLEX_H
#error "Nerver use <bits/cmathcalls.h> directly; include <complex.h> instead."
#endif

// 静态断言的实现
#define assert_static(e) \
do { \
enum { assert_static__ = 1/(e) }; \
} while (0)
// do while这样写可以避免if没有加括号而出现匹配异常的情况

异常

如果noexcept修饰的函数抛出了异常,编译器可用选择直接调用std::terminate()函数来终止程序的运行,如析构函数不应该抛出异常,所以默认是noexcept(true)。在c++98中,使用throw()来声明不抛出异常的函数。

阅读全文 »

ditto,记录复制信息,不需要重复复制。
snipaste,截图可以定在窗口,不需要来回切页面。
vscode:tabnine插件提示代码,设置自动换行”editor.wordWrap”: “on”.

brew安装慢或者没有反应,默认是github的源是国外的所以访问慢,所以需要换国内源,这里换的是清华的源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git -C "$(brew --repo)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile
brew update

# 安装工具,安装卡或者慢的继续观看文章,后面有解决方案
​# gifify开源项目地址:https://github.com/jclem/gifify
brew install gifify
# 切换到视频保存目录
cd Documents
# 重命名一下视频文件,原文件名太长转换会报错,也可以鼠标右键重命名
mv 屏幕录制2023-09-09\ 14.55.15.mov 1.mov
# 转换为gif
gifify 1.mov -o 1.gif

配置

rewrite regex replacement [flag];
rewrite的含义:该指令是实现URL重写的指令。
regex的含义:用于匹配URI的正则表达式。
replacement:将regex正则匹配到的内容替换成 replacement。
flag: flag标记。

flag有如下值:

  • last: 本条规则匹配完成后,继续向下匹配新的location URI 规则。(不常用)
  • break: 本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)。
  • redirect: 返回302临时重定向,浏览器地址会显示跳转新的URL地址。
  • permanent: 返回301永久重定向。浏览器地址会显示跳转新的URL地址。

比如rewrite ^/(.*) http://www.baidu.com/$1 permanent;
说明:

阅读全文 »

git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 更新所有tags:
git fetch --tags
# 查看其中一个tag:
git show V100
# 使用TortoiseGit里面的show log查看各个commit的提交情况。
# 从索引中删除文件。
git rm --cached
git stash pop stash@{1}
git merge master --allow-unrelated-histories
# 运行以下命令来获取远程仓库的最新分支信息
git fetch --all
# 检查已经获取到的所有分支列表
git branch -r
# 针对每个远程分支,在本地创建并切换到对应的分支上:
git checkout -b <本地分支名> <远程分支名>
git tag -a v1.0 abcdef1 -m "Version 1.0 released"
git push origin <tag_name>
# commit信息
git config commit.template .gitmessage

要将一个分支(例如,名为 source_branch)中的提交更改复制到另一个分支(例如,名为 destination_branch),你可以使用 git cherry-pick 命令。这个命令会将指定的提交复制到当前分支。

TortoiseGit

阅读全文 »

算法和数据结构

解题思路:画图、推演、分解。代码编写:代码规范、功能正确、边界问题、异常处理、效率问题。

深度优先搜索

求可能解的问题,而广度优先搜索是求最优解的问题。
解题步骤:按照规则顺序搜索,尽量不重复不遗漏枚举出所有可能分支。使用递归来实现:使用栈、考虑好退出条件、自己调用自己,拆分出类似解。回溯:切换其他可能分支,注意恢复原状态。剪枝:优化搜索性能,去除重复解,发现找不到解可以提前退出。

例子:求一个字符串的所有排列组合,不含重复解,字符串长度小于8。
画递归树:先确定第一个字符,让后面的字符串bc作为一个整体,再让第一个字符a与后面的字符bc分别进行交换,里面的整体bc重复同样的操作。

阅读全文 »
0%