函数
- 基于斯坦福cs106b的c++数据结构笔记 + 基于c++ primer plus的读书笔记
@@ -570,11 +570,13 @@
- 一些查找和排序算法
-二分查找法 最坏情况:log2n
+
c语言部分
+基本函数构成
+将数组传递为函数参数
+1
int fcname(int arg[],int n)
@@ -664,14 +666,14 @@
3.3k
+ 1.4k
-
@@ -720,7 +722,7 @@ c++特性
-
+
@@ -738,7 +740,7 @@ c++特性
- 基于c++ primer plus的读书笔记
+ 基于斯坦福cs106b的c++数据结构笔记
@@ -799,13 +801,11 @@
- c语言部分
-基本函数构成
-将数组传递为函数参数
-1
int fcname(int arg[],int n)
+ 一些查找和排序算法
+二分查找法 最坏情况:log2n
@@ -895,14 +895,14 @@
19k
+ 12k
-
@@ -970,14 +970,14 @@ 简介
站点总字数:
- 723k
+ 386k
diff --git a/photos/index.html b/photos/index.html
index c3dd68d7d..43984f296 100644
--- a/photos/index.html
+++ b/photos/index.html
@@ -335,14 +335,14 @@ 2024年贺图
站点总字数:
- 723k
+ 386k
diff --git a/search.xml b/search.xml
index f9aa93db7..76ec208d7 100644
--- a/search.xml
+++ b/search.xml
@@ -512,6 +512,17 @@ wars, wars never change
不过还有更好的方法吗?杀了一个人的人就必须死?如果过失杀人呢?故意杀人必须死?如果被杀人曾害杀人者妻离子散呢?没有仇怨杀人必须死?如果被杀者身上有传染病,不烧掉尸体就会让周边化为地狱呢?杀好人必须死?如果好人只是伪装,私底下男盗女娼呢?
无论如何都很难归纳出绝对正确的可以杀人的场合,因此只能这么说,只要行动,就会有犯下罪孽的可能性,即使什么都不做也是一样,归根到底,道德议题都会是虚无的,只有圈定一个前提,才能讨论一个局部解,那么不同群体的局部解又会不同
因此,只要杀人都是罪,这种观点未必对也未必错,无法证实也无法证伪,只是一个观点,如果说这种观点错,同样也可以否定其他观点,这就是为什么人类文明发展到现在也依旧有无数的罪恶
+复仇篇的发展远比英雄篇好猜,正义,英雄,这种概念是人类社会出现后才慢慢成型的事物,复仇则在更早之前就会出现
+证据就是,我小时候收养了流浪狗,不服管教被我妈追着打过,因此它一看到我妈就夹着尾巴,这是恐惧,畏惧,但到了适当的时候就会产生仇恨,仇恨就是这样一种原始的感情,例如农村的狗对着闯进领地的人狂叫,也是对侵占领地这种行为的“复仇”
+复仇只要伴随着生物本能就可以完成,这样的简单粗暴让其很多时候都不符合道德标准,正义更无从谈起,但作为人性中残留的兽性,这是必不可少的
+因此,复仇没什么好绕的,只要去杀戮就行了,但为什么哈姆雷特这样的人会犹豫呢?这不过是因为他当了太久的人,忘了怎么当裸猿,也就是说复仇很简单,复不复仇才是麻烦的地方,脱下人皮经典,再穿上又难了
+我是很不擅长阅读理解的那类人,语文很难考到平均分,因此我一般也看不出作者有什么私货,除了硬塞lgbt,黑龙也是龙这种太夸张的,因为我懒得猜作者到底什么意思,所以反而是最宽容的一类读者,对我来说作者写完的一瞬间,作品的解释权就被我这个读者垄断了,作者想要解释作品也只能以一个读者的身份来
+因此我倒不觉得村正反战败,我看出的是反杀人,杀任何人都有可能杀错,所以不要杀比较好,这种说法很极端,因为别人打不过了的话难道不反抗吗?所以这个说法还有补丁,心怀大爱的人就不要反抗,以肉饲鹰,没有这么高尚的人以牙还牙也无所谓,只是不要觉得自己就是对的。这样说完了还是很极端,难道世界上不存在正义的战争,怎么就不能觉得自己是正义的?但是还有补丁,这是从宏观视角看的,因为缺少前提的情况下,恶人的一命和善人的一命没有方法裁量,善与恶也难以分辨,这个前提取决于不同的人和不同的价值观,也就是换一个朴素正义感的视角,善人杀恶人就是天经地义的正义。
+这就绕了个大圈子回到了现实世界,为什么要这么麻烦呢,或者说为什么要这么极端呢?因为村正是为了醋包饺子,世界观下平民几乎没有半点希望,单人的武力可以灭国,毫无节制的强,你杀我我杀你,没几轮地球上就没人了,在这种特定情况下,很难说需不需要社会的存在,也很难说什么是道德准则,武力的使用会产生冲突,稍微多冲突几次地球就没人了,你以一个平民的视角看,不要使用任何武力也是个不错的结果,平民和那些超能力者已经不是同类了
+绕到这种程度还是很极端,为什么就要因噎废食,说不定在地球没人前,正义的超人们把邪恶方杀完了,又可以建立一个天国。这当然也可以,唯一的问题是会死人,死掉很多无辜的人,也未必能成功,对那些,比如流弹打死的人来说,正义又成了邪恶
+到最后我们就会发现一个朴素的道理,好人一次也不能出错,否则就成了恶人,村正部分角色的观点是,好人难做,那就什么都不做好了,或者以当恶人的觉悟去做好事
+论证到这个结论,还是很极端,因为好心干了坏事的好人也可以认为还是好人,好人战斗死的人很可能比不战斗死的人少,更何况可能真的有超人,永远好心干好事,这样的论证逐渐开始虚无了,因为这样的假设可以无数次做下去
+因此以上的一切只会是观点,无法像数学证明题一样完美的QED,同理,认为有私货的人也只是观点,我也可以假设作者的所想和我这些观点一样几乎等于什么都没说,因为换个类似现实的世界观一切就不同了
]]>
游戏杂谈
@@ -11758,160 +11769,6 @@ Inexpensive Disk)由美国加州大学伯克利分校提出。
数据结构与算法
-
- 基于斯坦福cs106b的c++数据结构笔记
- /thinklive/16615/
- 一些查找和排序算法
-二分查找法 最坏情况:log2n 寻找最小排序 向前插入算法
-合并算法接受两个排序的 列出并将它们组合成一个 排序列表。 ● 虽然两个列表都是非空的,但比较它们的 第一要素。 删除较小的元素 并将其附加到输出。 ● 一旦一个列表为空,添加所有元素 另一个列表输出。 ● 它运行时间为 O(n),其中 n 是总数 合并的元素数量。 无限递归后的合并算法 复杂度:nlog2n
-容器类
-set(集合):无序不允许重复的容器类,可以添加删除元素 You can add a value to a Set by writing set += value; s. ● You can remove a value from a Set by writing set -= value; ● You can check if a value exists in a Set by writing set.contains(value)
map(键值对的集合) 如果没有对应key的value,返回默认值(见定义文件) `vector vector的remove根据移除元素的索引有1-n的复杂度,移除尾部为O(1),如果不在意索引,可以交换要移除元素和尾部元素再移除
-哈希表
-哈希表的负载因子α表示元素和表格键数量的比,决定了查找速度
-检查表中是否存在元素
-● 计算元素的散列码。 ● 跳转到表格中的那个位置。 ● 向前扫描——必要时环绕——直到项目或一个 发现空插槽。
-将元素插入表中
-● 如果项目已经存在,什么也不做。 ● 否则,跳转到元素哈希码给定的槽。 向前走——必要时环绕——直到一个空白点或 找到墓碑插槽。 然后,将项目放在那里。
-从表中删除一个元素
-● 跳转到由元素的散列码给定的槽。 ● 向前走——必要时环绕——直到物品或 发现空插槽。 如果找到该项目,请将其替换为 墓碑。
-“罗宾汉哈希表”
-
-- 如果插入的值比其将插入的位置的值距离索引更远,则替换插入值和当前值
-- 删除值时,将后其离原键远的元素前移
-- ★ 罗宾汉哈希一览 ★
-- 检查表中是否存在元素:
-- ● 跳转到表中由元素的散列码给出的位置。
-- ● 向前扫描——如有必要环绕——记录有多少步 你拿走了。 当您找到该项目、找到一个空白槽或找到一个 离家更近的空位比你走的步数还多。
-- 将元素插入表中:
-- ● 如果该元素已在表中,则什么也不做。
-- ● 跳转到由元素的散列码给出的表槽。 向前扫描 - 换行 如有必要,四处走走——记录所走的步数。 如果你找到一个 空插槽,将元素放在那里。 否则,如果当前插槽已满并且 比您插入的元素更靠近家,将要插入的项目放在那里, 替换那个位置的元素,然后继续插入,就好像你 正在插入被置换的元素。
-- 从表中删除一个元素:
-- ● 跳转到由元素的散列码给定的槽。
-- ● 向前走——如有必要,环绕——直到物品或空槽被放置 成立。 如果找到该项目,请将其删除。 然后,继续前进——包裹 around as necessary – 将表中的元素向后移动一个槽位,直到 找到空插槽或位于其原始位置的项目
-
-string类
-str::npos表示容器的最后一个成员位置 if (s.find("e") != string::npos) //find函数找不到时返回npos if s in str: string obj; obj.substr(int pos) //pos为要包含的第一个字符串的位置 std::string a = "0123456789abcdefghij";
-
// count is npos, returns [pos, size())
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub1 = a.substr(10);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub1 << '\n';
// both pos and pos+count are within bounds, returns [pos, pos+count)
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub2 = a.substr(5, 3);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub2 << '\n';
// pos is within bounds, pos+count is not, returns [pos, size())
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub4 = a.substr(a.size()-3, 50);
// this is effectively equivalent to
// std::string sub4 = a.substr(17, 3);
// since a.size() == 20, pos == a.size()-3 == 17, and a.size()-pos == 3
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub4 << '\n';
try {
// pos is out of bounds, throws
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub5 = a.substr(a.size()+3, 50);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub5 << '\n';
} catch(const [std::out_of_range](http://en.cppreference.com/w/cpp/error/out_of_range)& e) {
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << "pos exceeds string size\n";
}
}
输出:
abcdefghij
567
hij
pos exceeds string size
-`replace和insert str1.insert(start, str2) str1.replace(start, length, str2)
-一些实现
-优先队列
-# include "HeapPQueue.h"
using namespace std;
HeapPQueue::HeapPQueue() {
elems = new DataPoint[INITIAL_SIZE] {};
for (int i=0;i<INITIAL_SIZE;i++)
{
elems[i].weight=0;
}
allocatedSize=INITIAL_SIZE;
}
HeapPQueue::~HeapPQueue() {
delete [] elems;
}
int HeapPQueue::size() const {
return logicalSize;
}
bool HeapPQueue::isEmpty() const {
return logicalSize==0;
}
void HeapPQueue::enqueue(const DataPoint& data) {
if (logicalSize+1<allocatedSize)
{
if (logicalSize==0)
{
elems[1]=data;
logicalSize++;
}
else
{
logicalSize++;
int i=1;
while (data.weight>elems[i].weight && i<=logicalSize && elems[i].weight!=0)
{
i++;
}
if (i<logicalSize)
{
DataPoint temp=elems[i];
elems[i]=data;
for(i;i<logicalSize;i++)
{
DataPoint temp_plus=elems[i+1];
elems[i+1]=temp;
temp=temp_plus;
}
}
else
{
elems[i]=data;
}
}
}
}
DataPoint HeapPQueue::peek() const {
return elems[logicalSize];
}
DataPoint HeapPQueue::dequeue() {
DataPoint to_return=elems[1];
if(!isEmpty())
{
for (int i=1;i<logicalSize;i++)
{
elems[i]=elems[i+1];
}
elems[logicalSize]={};
logicalSize--;
}
return to_return;
}
-计数排序
-首先算出最大值,然后用一个数组的索引存储待排序数组的成员,其索引对应值存储出现次数,然后用两个同步的for循环和递增的next参数表示排序中的索引值来进行排序(也就是重新赋值)
-/* Given a Vector<int>, returns the largest number in that Vector. */
int maxOf(const Vector<int>& values) {
/* Bounds-check inputs. */
if (values.isEmpty()) {
error("Can't find the maximum of no values.");
}
int result = values[0];
for (int i = 1; i < values.size(); i++) {
result = max(result, values[i]);
}
return result;
}
/* Given a list of numbers, creates a histogram from those numbers. */
Vector<int> histogramFor(const Vector<int>& values) {
/* Create a histogram with the right number of slots. Initially, all values
* in the histogram will be zero.
*/
Vector<int> histogram(maxOf(values) + 1);
/* Scan across the input vector, incrementing the histogram values. */
for (int value: values) {
histogram[value]++;
}
return histogram;
}
void countingSort(Vector<int>& values) {
/* Edge Case: If the array is empty, then it's already sorted. This is
* needed because we can't take the maximum value of an empty vector.
*/
if (values.isEmpty()) {
return;
}
/* Form the histogram. */
auto histogram = histogramFor(values);
/* Scan across the histogram writing out the appropriate number of copies
* of each value. We track the index of the next free spot to write to,
* as it varies based on how many items we've written out so far.
*/
int next = 0;
for (int value = 0; value < histogram.size(); value++) {
/* Write out the right number of copies. */
for (int copy = 0; copy < histogram[value]; copy++) {
values[next] = value;
next++;
}
}
}
-错题集
-递归的效率优化
-每次递归都会创造所有变量的临时复制 基于递归的这种性质,它会需要巨大的时间和空间来完成任务,并且会造成算力上的浪费。 通过记忆表机制能部分解决这个问题,方法是每次递归的返回值都会按索引存入一个表格,并且每次递归前查询表格中是否有结果,这样可以让每个临时副本的运算结果能被所有函数共享。
-递归计算给定元素的不同结构哈夫曼树的数量
-对每个给定元素集来说,首先要做到是确定根节点元素是第几个大的元素,确定之后,左子树和右子树的元素数也随之确定,在此之后分别对左节点和右节点作为根节点做同样的递归
-
int numBSTsOfSize(int n) {
/* Base case: There’s only one tree of size 0, namely, the empty BST. */
if (n == 0) return 1;
/* Recursive case: Imagine all possible ways to choose a root and build the
* left and right subtrees.
*/
int result = 0;
/* Put the the nodes at indices 0, 1, 2, ..., n-1 up at the root. */
for (int i = 0; i < n; i++) {
/* Each combination of a BST of i elements and a BST of n - 1 - i elements
* can be used to build one BST of n elements. The number of pairs of
* trees we can make this way is given by the product of the number of
* trees of each type.
*/
result += numBSTsOfSize(i) * numBSTsOfSize(n - 1 - i);
}
return result;
}
-递归解决吃巧克力问题
-求出吃法数量
-if (numSquares<0)
{
error("输入数据不能为负数");
}
else if (numSquares<=1)
{
return 1;
}
else
{
return numWaysToEat(numSquares-1)+numWaysToEat(numSquares-2);
}
-打印每种吃法
-`需要一个辅助向量储存历史记录
-/* Print all ways to eat numSquares more squares, given that we've
* already taken the bites given in soFar.
*/
void printWaysToEatRec(int numSquares, const Vector<int>& soFar) {
/* Base Case: If there are no squares left, the only option is to use
* the bites we've taken already in soFar.
*/
if (numSquares == 0) {
cout << soFar << endl;
}
/* Base Case: If there is one square lfet, the only option is to eat
* that square.
*/
else if (numSquares == 1) {
cout << soFar + 1 << endl;
}
/* Otherwise, we take take bites of size one or of size two. */
else {
printWaysToEatRec(numSquares - 1, soFar + 1);
printWaysToEatRec(numSquares - 2, soFar + 2);
}
}
void printWaysToEat(int numSquares) {
if (numSquares < 0) {
error("You owe me some chocolate!");
}
/* We begin without having made any bites. */
printWaysToEatRec(numSquares, {});
}
-递归解决翻煎饼问题
-bool isSorted(Stack<double> pancakes) {
double last = -1; // No pancakes have negative size;
while (!pancakes.isEmpty()) {
/* Check the next pancake. */
double next = pancakes.pop();
if (next < last) {
return false;
}
last = next;
}
/* Pancakes are in increasing order! */
return true;
}
/* Given a stack of pancakes and a flip size, flips that many pancakes
* on the top of the stack.
*/
Stack<double> flip(Stack<double> pancakes, int numToFlip) {
/* Take the top pancakes off the stack and run them into a queue.
* This preserves the order in which they were removed.
*/
Queue<double> buffer;
for (int i = 0; i < numToFlip; i++) {
buffer.enqueue(pancakes.pop());
}
/* Move the pancakes back. */
while (!buffer.isEmpty()) {
pancakes.push(buffer.dequeue());
}
return pancakes;
}
Optional<Vector<int>> sortStack(Stack<double> pancakes, int numFlips) {
/* Base Case: If the stack is sorted, great! We're done, and no flips
* were needed.
*/
if (isSorted(pancakes)) {
return { }; // No flips
}
/* Base Case: If the stack isn't sorted and we're out of flips, then
* there is no way to sort things.
*/
else if (numFlips == 0) {
return Nothing;
}
/* Recursive Case: The stack isn't sorted and we still have flips left.
* The next flip could flip 1, 2, 3, ..., or all N of the pancakes.
* Try each option and see whether any of them work.
*/
for (int numToFlip = 1; numToFlip <= pancakes.size(); numToFlip++) {
/* Make the flip and see if it works. */
auto result = sortStack(flip(pancakes, numToFlip), numFlips - 1);
if (result != Nothing) {
/* The result holds all the remaining flips but doesn't know about
* the flip we just did. Insert that flip at the beginning.
*/
result.value().insert(0, numToFlip);
return result;
}
}
/* If we're here, then no matter which flip we make first, we cannot
* get the pancakes sorted. Give up.
*/
return Nothing;
}
-递归解决天平问题
-bool isMeasurableRec(int amount, const Vector<int>& weights, int index) {
if (index == weights.size()) {
return amount == 0;
} else {
return isMeasurableRec(amount, weights, index + 1) ||
isMeasurableRec(amount + weights[index], weights, index + 1) ||
isMeasurableRec(amount - weights[index], weights, index + 1);
}
}
bool isMeasurable(int amount, const Vector<int>& weights) {
return isMeasurableRec(amount, weights, 0);
}
-想象一下,我们首先将要测量的数量(称为 n )放在天平的左侧。 这使得规模上的不平衡等于 n 。 想象一下,有某种方法可以测量 n 。 如果我们一次将一个重量放在秤上,我们可以查看第一个重量的放置位置(假设它的重量为 w )。 它必须:
-
-- 向左走,使规模上的净不平衡 n + w ,或
-- 向右走,使规模上的净不平衡 n – w ,或
-- 根本不习惯,留下净不平衡 n 。
-
-如果确实有可能测量 n ,那么这三个选项之一必须是实现它的方法,即使我们不知道它是哪一个。 然后我们要问的问题是,是否有可能使用剩余的权重来衡量新的净失衡——我们可以递归地确定! 另一方面,如果无法测量 n ,那么无论我们选择哪个选项,我们都会发现没有办法使用剩余的权重来使一切平衡!
-如果我们递归地进行,我们在这里,我们需要考虑我们的基本情况。 我们可以选择的选项有很多。 一个简单的方法如下:假设我们根本没有任何重量,我们被要求查看是否可以不使用重量来测量某些重量。 在什么情况下我们可以这样做? 好吧,如果我们称重的东西有一个非零重量,我们就不可能测量它——把它放在秤上会使它倾斜到某一边,但这并不能告诉我们它有多少重量。 另一方面,如果我们称量的东西是完全失重的,那么把它放在秤上也不会导致它倾斜,让我们相信它确实是失重的! 因此,作为我们的基本情况,我们会说当我们减少到没有剩余权重时, ,我们可以精确测量n 如果 n = 0 。 考虑到这一点,这是我们的代码:
-递归解决找零问题
-不使用记忆的情况
-`从第一个硬币开始遍历,并穷举它的所有枚数,将其作为下一枚硬币的参数传递
-int fewestCoinsFor(int cents, const Set<int>& coins) {
/* Can't have a negative number of cents. */
if (cents < 0) {
error("You owe me money, not the other way around!");
}
/* Base case: You need no coins to give change for no cents. */
else if (cents == 0) {
return 0;
}
/* Base case: No coins exist. Then it's not possible to make the
* amount. In that case, give back a really large value as a
* sentinel.
*/
else if (coins.isEmpty()) {
return cents + 1;
}
/* Recursive case: Pick a coin, then try using each distinct number of
* copies of it that we can.
*/
else {
/* The best we've found so far. We initialize this to a large value so
* that it's replaced on the first iteration of the loop. Do you see
* why cents + 1 is a good choice?
*/
int bestSoFar = cents + 1;
/* Pick a coin. */
int coin = coins.first();
/* Try all amounts of it. */
for (int copies = 0; copies * coin <= cents; copies++) {
/* See what happens if we make this choice. Once we use this
* coin, we won't use the same coin again in the future.
*/
int thisChoice = copies + fewestCoinsFor(cents - copies * coin,
coins - coin);
/* Is this better than what we have so far? */
if (thisChoice < bestSoFar) {
bestSoFar = thisChoice;
}
}
/* Return whatever worked best. */
return bestSoFar;
}
}
-使用记忆进行优化
-/* How few coins are needed to make the total, given that we can only use
* coins from index startIndex and onward?
*/
int fewestCoinsRec(int cents, const Vector<int>& coins, int startIndex,Grid<int>& memo) {
/* Base case: You need no coins to give change for no cents. */
if (cents == 0) {
return 0;
}
/* Base case: No coins exist. Then it's not possible to make the
* amount. In that case, give back a really large value as a
* sentinel.
*/
else if (startIndex == coins.size()) {
return cents + 1;
}
/* Base case: We already know the answer. */
else if (memo[cents][startIndex] != -1) {
return memo[cents][startIndex];
}
/* Recursive case: Pick a coin, then try using each distinct number of
* copies of it that we can.
*/
else {
/* The best we've found so far. We initialize this to a large value so
* that it's replaced on the first iteration of the loop. Do you see
* why cents + 1 is a good choice?
*/
int bestSoFar = cents + 1;
/* Pick a coin. */
int coin = coins[startIndex];
/* Try all amounts of it. */
for (int copies = 0; copies * coin <= cents; copies++) {
/* See what happens if we make this choice. Once we use this
* coin, we won't use the same coin again in the future.
*/
int thisChoice = copies + fewestCoinsRec(cents - copies * coin,
coins, startIndex + 1,
memo);
/* Is this better than what we have so far? */
if (thisChoice < bestSoFar) {
bestSoFar = thisChoice;
}
}
/* Return whatever worked best. */
memo[cents][startIndex] = bestSoFar;
return bestSoFar;
}
}
int fewestCoinsFor(int cents, const Set<int>& coins) {
/* Can't have a negative number of cents. */
if (cents < 0) {
error("You owe me money, not the other way around!");
}
/* Convert from a Set<int> to a Vector<int> so we have a nice ordering
* on things.
*/
Vector<int> coinVec;
for (int coin: coins) {
coinVec += coin;
}
/* Build our memoization table. Since the number of cents left ranges from
* 0 to cents, we need cents+1 rows. Since the start index of the coin
* ranges from 0 to coins.size(), we make coins.size() + 1 columns.
*
* -1 is used as a sentinel to indicate "nothing has been computed here
* yet."
*/
Grid<int> memo(cents + 1, coins.size() + 1, -1);
/* Now ask how many coins are needed to make the total, using any coins
* from index 0 onward.
*/
return fewestCoinsRec(cents, coinVec, 0, memo);
}
-递归穷举付账单
-递归机制:对第一个人来说,0-total所有金额都会付一遍,随后传递给下一个人,当只有一人时,付清所有余额并打印账单 传递参数:string,int的映射存储目前为止的账单,string集合存储所有付账者
-void listPossiblePaymentsRec(int total, const Set<string>& people,const Map<string, int>& payments) {
/* Base case: if there's one person left, they have to pay the whole bill. */
if (people.size() == 1) {
Map<string, int> finalPayments = payments;
finalPayments[people.first()] = total;
cout << finalPayments << endl;
}
/* Recursive case: The first person has to pay some amount between 0 and the
* total amount. Try all of those possibilities.
*/
else {
for (int payment = 0; payment <= total; payment++) {
/* Create a new assignment of people to payments in which this first
* person pays this amount.
*/
Map<string, int> updatedPayments = payments;
updatedPayments[people.first()] = payment;
listPossiblePaymentsRec(total - payment, people - people.first(),updatedPayments);
}
}
}
void listPossiblePayments(int total, const Set<string>& people) {
/* Edge cases: we can't pay a negative total, and there must be at least one
* person.
*/
if (total < 0) error("Guess you're an employee?");
if (people.isEmpty()) error("Dine and dash?");
listPossiblePaymentsRec(total, people, {});
}
-递归寻找完全平方数列
-主要参数为sofar——用于存储目前的序列和一个set用于存储还没放入数列的数字,`确保这两者同时被传递,且其并集为所有数字
-Optional<Vector<int>> findSquareSequence(int n) {
/*Validate input.*/
if (n < 0) {
error("Don't be so negative!");
}
/* Build a set of the numbers 1, 2, 3, ..., n. */
Set<int> options;
for (int i = 1; i <= n; i++) {
options += i;
}
return findSequenceRec(options, { });
}
Optional<Vector<int>> findSequenceRec(const Set<int>& unused,
const Vector<int>& soFar) {
/*Base Case: If all numbers are used, we have our sequence!*/
if (unused.isEmpty()) {
return soFar;
}
/* Recursive Case: Some number comes next. Try each of them and see which
* one we should pick.
*/
for (int next: unused) {
/* We can use this if either
*
* 1. the sequence is empty, so we're first in line, or
* 2. the sequence is not empty, but we sum to a perfect square
* with the previous term.
*/
if (soFar.isEmpty() ||
isPerfectSquare(next + soFar[soFar.size() - 1])) {
/* See what happens if we extend with this number. */
auto result = findSequenceRec(unused - next, soFar + next);
if (result != Nothing) {
return result;
}
}
}
/* Tried all options and none of them worked. Oh well! */
return Nothing;
}
-汉诺塔递归
-假设有三座汉诺塔,start ,temp ,finish
对n层的汉诺塔问题,先考虑n-1层的,随后考虑n-2层,到最后只需要考虑两层问题,两层的汉诺塔非常容易解决,起点为start,终点是temp,临时塔为finish,最后我们得到temp上的两层汉诺塔 这时将start的3移动到finish塔,这时只要将两层汉诺塔转移到finish则完成了三层汉诺塔,这个过程中的起点为temp,终点是finish,临时塔是start 以此类推,四层塔基于三层塔,n
层塔基于n-1
塔,汉诺塔问题解决
-int moveTower(int numDisks, char start, char finish, char temp) {
if (numDisks == 0) {
return 0;
} else {
int movesOne = moveTower(numDisks - 1, start, temp, finish);
moveSingleDisk(start, finish);
int movesTwo = moveTower(numDisks - 1, temp, finish, start);
return 1 + movesOne + movesTwo;
}
}
-]]>
-
- 课程笔记
- 数据结构与算法
-
-
- 课程笔记
- 数据结构与算法
- 斯坦福
- c++
-
-
-
- 基于斯坦福cs106l的c++编程规范笔记
- /thinklive/48468/
- c++特性
-
-- 更好的C C++支持
命令式编程
,一种编程风格,其中程序按顺序执行的命令序列。从这个意义上讲,C++ 可以看作是对C 编程语言,使日常命令式编程更加直观和更容易使用。课程阅读器的这一部分介绍了一些 C++ 最常用的库,包括标准模板库,并展示了如何使用这些库来构建命令程式。 此外,它探索了最初出现在 C++ 语言中的新原语。C 编程语言,即指针、C 字符串和预处理器。
-- 数据抽象
-
-C++与其兄弟C的最大区别在于_数据抽象_,程序执行的方式可以与程序执行的方式分开 程序员谈论那个程序。
-
-- 面向对象编程
-
-. 面向对象编程是一种完全不同的方式考虑程序设计,可以极大地简化复杂的软件系统。 钥匙 面向对象背后的概念很简单,但要真正体会到面向对象的力量 编程,您将需要一次又一次地看到它的运行情况。 这部分课程 读者探索了面向对象编程中的主要概念以及如何在 C++ 中实现它继承和多态。
-
-- 泛型编程
-
-泛型编程是一种编程风格,旨在构建可以解决一系列远远超出最初设想的问题的软件
-履行。 虽然泛型编程的完整处理远远超出了介绍性的范围C++ 编程课,泛型编程的许多思想都可以访问并且可以从根本上改变了您对 C++ 编程的看法。
-const
-Can’t declare non-const reference to const variable Can’t declare non-const reference to const vari
-
-模板
- 函数指针:将函数作为对象传递
-stl
-sequence:线性,有顺序 associative:不一定线性,有索引机制(map)
-vector:有顺序的相同类型的数据集合,大小可控制 ---子属性:size:元素数量 ---capacity:单个元素大小 vector最常用,deque用于首部插入场合,list用于多种列表
-associative(关联数组):有顺序的需要有比较方法,无序的需要哈希函数(更快) iterators(迭代器):用于访问容器中的所有数据 --常用函数,begin(),end(),iter++,*(pointer),== !=,=(赋值,复制),
-输入输出流
-First call to std::cin >> creates a command line
-prompt that allows the user to type until they hit enter
-
-- Each >> ONLY reads until the next whitespace
-
-- Whitespace = tab, space, newline
-
-- Everything after the first whitespace gets saved and
-used the next time std::cin >> is called
-
-- The place its saved is called a buffer
-
-hashmap的c++实现
-相关函数
-构造函数HashMap():
接受参数count(值的个数),hash function(有默认值)
参数(typename fitst,typename last,bucket_count,H)
//用一个容器首尾指针初始化hashmap
eg.
hashmap<k,m> map{vec.begin(),vec.end()}
参数(init_list init,bucket_count,H)
//用容器直接初始化hashmap
eg.
HashMap<char, int> map{{'a', 3}, {'b', 5}, {'c', 7}};
public:
key-键
mapped-被加密的值(int)
H-哈希函数
bucket_count(存储的键值对数组容量)
load_factor(内联函数,返回size/bucket_count,即实际储存值的键值对)
contains(参数const K& key判断是否存在改键,返回bool值)
at(参数k,返回mapped的引用)
clear(清空键值对)
insert(参数为键值对引用,返回一对pair<iterator,bool>,iter指向改键值对,无论是否已存在,bool表示是否成功添加,如为false则已存在该键值对)
erase(key为参数,返回bool值)
earse(iter为参数,返回该指针下一个位置)
rehash(size_t为参数,重新哈希为给出的新的指针数组大小)
begin(根据hashmap是否为const给出iter或const iter)
end(返回伪指针)
debug(打印所有哈希键值对以及哈希表所有参数,注意,必须基于重载<<运算符的基础)
符号重载:
M& [](const key& ,返回insert(key)的返回pair的first成员的second成员,即mapped值)
//用于给key对应的value(mapped)赋值
private:
node(struct,包含next指针和value)
nodepair(前后node的pair)
findnode(参数key,返回指针对<prev,curr>)
first_not_empty_bucket()
make_iterator(参数node*curr)
_bucket_array(vector<node*>,其中一个node*为ptr,则ptr->value为<key ,mapped>)
//指针构造
_bucket_array:由指针组成的数组,每个成员都是一个指针
储存的值为next指针和一个pair<key,mapped>
operator-> is a bit of an odd-ball. When you write p->m, it is interpreted as (p.operator->())->m.
- This means operator-> should return a pointer to the object that has the field m.
-涉及的c++特性
-匿名函数 基本lambda语法 基本形式如下: 【capture】(parameters)->return-type {body}
-typename function() return {x,y,z} 即用{}的参数初始化原函数返回的类型
-ptrdiff_t:用于储存两个指针的差
-conditional_t<func,x,y>如果func为true则x,为false则y
-forward_iterator_tag:单方向迭代器(可读写) ++iter,iter+=1随后返回对自身的引用 iter++,先返回一个对自身的复制,随后iter+=1
-std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
-ate:从文件尾部开始 strsub(start,length) 移动语义(c++11新特性) clss(classname &&) 利用右值引用的部分数据直接初始化新的类,并在初始化之后将右值删除,可以通过std::move()强制转化左值为右值。
-]]>
-
- 课程笔记
- 数据结构与算法
-
-
- 课程笔记
- 斯坦福
- c++
-
-
基于c++ primer plus的读书笔记
/thinklive/15197/
@@ -12021,8 +11878,162 @@ used the next time std::cin >> is called
其他
- c++
读书笔记
+ c++
+
+
+
+ 基于斯坦福cs106l的c++编程规范笔记
+ /thinklive/48468/
+ c++特性
+
+- 更好的C C++支持
命令式编程
,一种编程风格,其中程序按顺序执行的命令序列。从这个意义上讲,C++ 可以看作是对C 编程语言,使日常命令式编程更加直观和更容易使用。课程阅读器的这一部分介绍了一些 C++ 最常用的库,包括标准模板库,并展示了如何使用这些库来构建命令程式。 此外,它探索了最初出现在 C++ 语言中的新原语。C 编程语言,即指针、C 字符串和预处理器。
+- 数据抽象
+
+C++与其兄弟C的最大区别在于_数据抽象_,程序执行的方式可以与程序执行的方式分开 程序员谈论那个程序。
+
+- 面向对象编程
+
+. 面向对象编程是一种完全不同的方式考虑程序设计,可以极大地简化复杂的软件系统。 钥匙 面向对象背后的概念很简单,但要真正体会到面向对象的力量 编程,您将需要一次又一次地看到它的运行情况。 这部分课程 读者探索了面向对象编程中的主要概念以及如何在 C++ 中实现它继承和多态。
+
+- 泛型编程
+
+泛型编程是一种编程风格,旨在构建可以解决一系列远远超出最初设想的问题的软件
+履行。 虽然泛型编程的完整处理远远超出了介绍性的范围C++ 编程课,泛型编程的许多思想都可以访问并且可以从根本上改变了您对 C++ 编程的看法。
+const
+Can’t declare non-const reference to const variable Can’t declare non-const reference to const vari
+
+模板
+ 函数指针:将函数作为对象传递
+stl
+sequence:线性,有顺序 associative:不一定线性,有索引机制(map)
+vector:有顺序的相同类型的数据集合,大小可控制 ---子属性:size:元素数量 ---capacity:单个元素大小 vector最常用,deque用于首部插入场合,list用于多种列表
+associative(关联数组):有顺序的需要有比较方法,无序的需要哈希函数(更快) iterators(迭代器):用于访问容器中的所有数据 --常用函数,begin(),end(),iter++,*(pointer),== !=,=(赋值,复制),
+输入输出流
+First call to std::cin >> creates a command line
+prompt that allows the user to type until they hit enter
+
+- Each >> ONLY reads until the next whitespace
+
+- Whitespace = tab, space, newline
+
+- Everything after the first whitespace gets saved and
+used the next time std::cin >> is called
+
+- The place its saved is called a buffer
+
+hashmap的c++实现
+相关函数
+构造函数HashMap():
接受参数count(值的个数),hash function(有默认值)
参数(typename fitst,typename last,bucket_count,H)
//用一个容器首尾指针初始化hashmap
eg.
hashmap<k,m> map{vec.begin(),vec.end()}
参数(init_list init,bucket_count,H)
//用容器直接初始化hashmap
eg.
HashMap<char, int> map{{'a', 3}, {'b', 5}, {'c', 7}};
public:
key-键
mapped-被加密的值(int)
H-哈希函数
bucket_count(存储的键值对数组容量)
load_factor(内联函数,返回size/bucket_count,即实际储存值的键值对)
contains(参数const K& key判断是否存在改键,返回bool值)
at(参数k,返回mapped的引用)
clear(清空键值对)
insert(参数为键值对引用,返回一对pair<iterator,bool>,iter指向改键值对,无论是否已存在,bool表示是否成功添加,如为false则已存在该键值对)
erase(key为参数,返回bool值)
earse(iter为参数,返回该指针下一个位置)
rehash(size_t为参数,重新哈希为给出的新的指针数组大小)
begin(根据hashmap是否为const给出iter或const iter)
end(返回伪指针)
debug(打印所有哈希键值对以及哈希表所有参数,注意,必须基于重载<<运算符的基础)
符号重载:
M& [](const key& ,返回insert(key)的返回pair的first成员的second成员,即mapped值)
//用于给key对应的value(mapped)赋值
private:
node(struct,包含next指针和value)
nodepair(前后node的pair)
findnode(参数key,返回指针对<prev,curr>)
first_not_empty_bucket()
make_iterator(参数node*curr)
_bucket_array(vector<node*>,其中一个node*为ptr,则ptr->value为<key ,mapped>)
//指针构造
_bucket_array:由指针组成的数组,每个成员都是一个指针
储存的值为next指针和一个pair<key,mapped>
operator-> is a bit of an odd-ball. When you write p->m, it is interpreted as (p.operator->())->m.
- This means operator-> should return a pointer to the object that has the field m.
+涉及的c++特性
+匿名函数 基本lambda语法 基本形式如下: 【capture】(parameters)->return-type {body}
+typename function() return {x,y,z} 即用{}的参数初始化原函数返回的类型
+ptrdiff_t:用于储存两个指针的差
+conditional_t<func,x,y>如果func为true则x,为false则y
+forward_iterator_tag:单方向迭代器(可读写) ++iter,iter+=1随后返回对自身的引用 iter++,先返回一个对自身的复制,随后iter+=1
+std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
+ate:从文件尾部开始 strsub(start,length) 移动语义(c++11新特性) clss(classname &&) 利用右值引用的部分数据直接初始化新的类,并在初始化之后将右值删除,可以通过std::move()强制转化左值为右值。
+]]>
+
+ 课程笔记
+ 数据结构与算法
+
+
+ 课程笔记
+ c++
+ 斯坦福
+
+
+
+ 基于斯坦福cs106b的c++数据结构笔记
+ /thinklive/16615/
+ 一些查找和排序算法
+二分查找法 最坏情况:log2n 寻找最小排序 向前插入算法
+合并算法接受两个排序的 列出并将它们组合成一个 排序列表。 ● 虽然两个列表都是非空的,但比较它们的 第一要素。 删除较小的元素 并将其附加到输出。 ● 一旦一个列表为空,添加所有元素 另一个列表输出。 ● 它运行时间为 O(n),其中 n 是总数 合并的元素数量。 无限递归后的合并算法 复杂度:nlog2n
+容器类
+set(集合):无序不允许重复的容器类,可以添加删除元素 You can add a value to a Set by writing set += value; s. ● You can remove a value from a Set by writing set -= value; ● You can check if a value exists in a Set by writing set.contains(value)
map(键值对的集合) 如果没有对应key的value,返回默认值(见定义文件) `vector vector的remove根据移除元素的索引有1-n的复杂度,移除尾部为O(1),如果不在意索引,可以交换要移除元素和尾部元素再移除
+哈希表
+哈希表的负载因子α表示元素和表格键数量的比,决定了查找速度
+检查表中是否存在元素
+● 计算元素的散列码。 ● 跳转到表格中的那个位置。 ● 向前扫描——必要时环绕——直到项目或一个 发现空插槽。
+将元素插入表中
+● 如果项目已经存在,什么也不做。 ● 否则,跳转到元素哈希码给定的槽。 向前走——必要时环绕——直到一个空白点或 找到墓碑插槽。 然后,将项目放在那里。
+从表中删除一个元素
+● 跳转到由元素的散列码给定的槽。 ● 向前走——必要时环绕——直到物品或 发现空插槽。 如果找到该项目,请将其替换为 墓碑。
+“罗宾汉哈希表”
+
+- 如果插入的值比其将插入的位置的值距离索引更远,则替换插入值和当前值
+- 删除值时,将后其离原键远的元素前移
+- ★ 罗宾汉哈希一览 ★
+- 检查表中是否存在元素:
+- ● 跳转到表中由元素的散列码给出的位置。
+- ● 向前扫描——如有必要环绕——记录有多少步 你拿走了。 当您找到该项目、找到一个空白槽或找到一个 离家更近的空位比你走的步数还多。
+- 将元素插入表中:
+- ● 如果该元素已在表中,则什么也不做。
+- ● 跳转到由元素的散列码给出的表槽。 向前扫描 - 换行 如有必要,四处走走——记录所走的步数。 如果你找到一个 空插槽,将元素放在那里。 否则,如果当前插槽已满并且 比您插入的元素更靠近家,将要插入的项目放在那里, 替换那个位置的元素,然后继续插入,就好像你 正在插入被置换的元素。
+- 从表中删除一个元素:
+- ● 跳转到由元素的散列码给定的槽。
+- ● 向前走——如有必要,环绕——直到物品或空槽被放置 成立。 如果找到该项目,请将其删除。 然后,继续前进——包裹 around as necessary – 将表中的元素向后移动一个槽位,直到 找到空插槽或位于其原始位置的项目
+
+string类
+str::npos表示容器的最后一个成员位置 if (s.find("e") != string::npos) //find函数找不到时返回npos if s in str: string obj; obj.substr(int pos) //pos为要包含的第一个字符串的位置 std::string a = "0123456789abcdefghij";
+
// count is npos, returns [pos, size())
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub1 = a.substr(10);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub1 << '\n';
// both pos and pos+count are within bounds, returns [pos, pos+count)
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub2 = a.substr(5, 3);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub2 << '\n';
// pos is within bounds, pos+count is not, returns [pos, size())
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub4 = a.substr(a.size()-3, 50);
// this is effectively equivalent to
// std::string sub4 = a.substr(17, 3);
// since a.size() == 20, pos == a.size()-3 == 17, and a.size()-pos == 3
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub4 << '\n';
try {
// pos is out of bounds, throws
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub5 = a.substr(a.size()+3, 50);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub5 << '\n';
} catch(const [std::out_of_range](http://en.cppreference.com/w/cpp/error/out_of_range)& e) {
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << "pos exceeds string size\n";
}
}
输出:
abcdefghij
567
hij
pos exceeds string size
+`replace和insert str1.insert(start, str2) str1.replace(start, length, str2)
+一些实现
+优先队列
+# include "HeapPQueue.h"
using namespace std;
HeapPQueue::HeapPQueue() {
elems = new DataPoint[INITIAL_SIZE] {};
for (int i=0;i<INITIAL_SIZE;i++)
{
elems[i].weight=0;
}
allocatedSize=INITIAL_SIZE;
}
HeapPQueue::~HeapPQueue() {
delete [] elems;
}
int HeapPQueue::size() const {
return logicalSize;
}
bool HeapPQueue::isEmpty() const {
return logicalSize==0;
}
void HeapPQueue::enqueue(const DataPoint& data) {
if (logicalSize+1<allocatedSize)
{
if (logicalSize==0)
{
elems[1]=data;
logicalSize++;
}
else
{
logicalSize++;
int i=1;
while (data.weight>elems[i].weight && i<=logicalSize && elems[i].weight!=0)
{
i++;
}
if (i<logicalSize)
{
DataPoint temp=elems[i];
elems[i]=data;
for(i;i<logicalSize;i++)
{
DataPoint temp_plus=elems[i+1];
elems[i+1]=temp;
temp=temp_plus;
}
}
else
{
elems[i]=data;
}
}
}
}
DataPoint HeapPQueue::peek() const {
return elems[logicalSize];
}
DataPoint HeapPQueue::dequeue() {
DataPoint to_return=elems[1];
if(!isEmpty())
{
for (int i=1;i<logicalSize;i++)
{
elems[i]=elems[i+1];
}
elems[logicalSize]={};
logicalSize--;
}
return to_return;
}
+计数排序
+首先算出最大值,然后用一个数组的索引存储待排序数组的成员,其索引对应值存储出现次数,然后用两个同步的for循环和递增的next参数表示排序中的索引值来进行排序(也就是重新赋值)
+/* Given a Vector<int>, returns the largest number in that Vector. */
int maxOf(const Vector<int>& values) {
/* Bounds-check inputs. */
if (values.isEmpty()) {
error("Can't find the maximum of no values.");
}
int result = values[0];
for (int i = 1; i < values.size(); i++) {
result = max(result, values[i]);
}
return result;
}
/* Given a list of numbers, creates a histogram from those numbers. */
Vector<int> histogramFor(const Vector<int>& values) {
/* Create a histogram with the right number of slots. Initially, all values
* in the histogram will be zero.
*/
Vector<int> histogram(maxOf(values) + 1);
/* Scan across the input vector, incrementing the histogram values. */
for (int value: values) {
histogram[value]++;
}
return histogram;
}
void countingSort(Vector<int>& values) {
/* Edge Case: If the array is empty, then it's already sorted. This is
* needed because we can't take the maximum value of an empty vector.
*/
if (values.isEmpty()) {
return;
}
/* Form the histogram. */
auto histogram = histogramFor(values);
/* Scan across the histogram writing out the appropriate number of copies
* of each value. We track the index of the next free spot to write to,
* as it varies based on how many items we've written out so far.
*/
int next = 0;
for (int value = 0; value < histogram.size(); value++) {
/* Write out the right number of copies. */
for (int copy = 0; copy < histogram[value]; copy++) {
values[next] = value;
next++;
}
}
}
+错题集
+递归的效率优化
+每次递归都会创造所有变量的临时复制 基于递归的这种性质,它会需要巨大的时间和空间来完成任务,并且会造成算力上的浪费。 通过记忆表机制能部分解决这个问题,方法是每次递归的返回值都会按索引存入一个表格,并且每次递归前查询表格中是否有结果,这样可以让每个临时副本的运算结果能被所有函数共享。
+递归计算给定元素的不同结构哈夫曼树的数量
+对每个给定元素集来说,首先要做到是确定根节点元素是第几个大的元素,确定之后,左子树和右子树的元素数也随之确定,在此之后分别对左节点和右节点作为根节点做同样的递归
+
int numBSTsOfSize(int n) {
/* Base case: There’s only one tree of size 0, namely, the empty BST. */
if (n == 0) return 1;
/* Recursive case: Imagine all possible ways to choose a root and build the
* left and right subtrees.
*/
int result = 0;
/* Put the the nodes at indices 0, 1, 2, ..., n-1 up at the root. */
for (int i = 0; i < n; i++) {
/* Each combination of a BST of i elements and a BST of n - 1 - i elements
* can be used to build one BST of n elements. The number of pairs of
* trees we can make this way is given by the product of the number of
* trees of each type.
*/
result += numBSTsOfSize(i) * numBSTsOfSize(n - 1 - i);
}
return result;
}
+递归解决吃巧克力问题
+求出吃法数量
+if (numSquares<0)
{
error("输入数据不能为负数");
}
else if (numSquares<=1)
{
return 1;
}
else
{
return numWaysToEat(numSquares-1)+numWaysToEat(numSquares-2);
}
+打印每种吃法
+`需要一个辅助向量储存历史记录
+/* Print all ways to eat numSquares more squares, given that we've
* already taken the bites given in soFar.
*/
void printWaysToEatRec(int numSquares, const Vector<int>& soFar) {
/* Base Case: If there are no squares left, the only option is to use
* the bites we've taken already in soFar.
*/
if (numSquares == 0) {
cout << soFar << endl;
}
/* Base Case: If there is one square lfet, the only option is to eat
* that square.
*/
else if (numSquares == 1) {
cout << soFar + 1 << endl;
}
/* Otherwise, we take take bites of size one or of size two. */
else {
printWaysToEatRec(numSquares - 1, soFar + 1);
printWaysToEatRec(numSquares - 2, soFar + 2);
}
}
void printWaysToEat(int numSquares) {
if (numSquares < 0) {
error("You owe me some chocolate!");
}
/* We begin without having made any bites. */
printWaysToEatRec(numSquares, {});
}
+递归解决翻煎饼问题
+bool isSorted(Stack<double> pancakes) {
double last = -1; // No pancakes have negative size;
while (!pancakes.isEmpty()) {
/* Check the next pancake. */
double next = pancakes.pop();
if (next < last) {
return false;
}
last = next;
}
/* Pancakes are in increasing order! */
return true;
}
/* Given a stack of pancakes and a flip size, flips that many pancakes
* on the top of the stack.
*/
Stack<double> flip(Stack<double> pancakes, int numToFlip) {
/* Take the top pancakes off the stack and run them into a queue.
* This preserves the order in which they were removed.
*/
Queue<double> buffer;
for (int i = 0; i < numToFlip; i++) {
buffer.enqueue(pancakes.pop());
}
/* Move the pancakes back. */
while (!buffer.isEmpty()) {
pancakes.push(buffer.dequeue());
}
return pancakes;
}
Optional<Vector<int>> sortStack(Stack<double> pancakes, int numFlips) {
/* Base Case: If the stack is sorted, great! We're done, and no flips
* were needed.
*/
if (isSorted(pancakes)) {
return { }; // No flips
}
/* Base Case: If the stack isn't sorted and we're out of flips, then
* there is no way to sort things.
*/
else if (numFlips == 0) {
return Nothing;
}
/* Recursive Case: The stack isn't sorted and we still have flips left.
* The next flip could flip 1, 2, 3, ..., or all N of the pancakes.
* Try each option and see whether any of them work.
*/
for (int numToFlip = 1; numToFlip <= pancakes.size(); numToFlip++) {
/* Make the flip and see if it works. */
auto result = sortStack(flip(pancakes, numToFlip), numFlips - 1);
if (result != Nothing) {
/* The result holds all the remaining flips but doesn't know about
* the flip we just did. Insert that flip at the beginning.
*/
result.value().insert(0, numToFlip);
return result;
}
}
/* If we're here, then no matter which flip we make first, we cannot
* get the pancakes sorted. Give up.
*/
return Nothing;
}
+递归解决天平问题
+bool isMeasurableRec(int amount, const Vector<int>& weights, int index) {
if (index == weights.size()) {
return amount == 0;
} else {
return isMeasurableRec(amount, weights, index + 1) ||
isMeasurableRec(amount + weights[index], weights, index + 1) ||
isMeasurableRec(amount - weights[index], weights, index + 1);
}
}
bool isMeasurable(int amount, const Vector<int>& weights) {
return isMeasurableRec(amount, weights, 0);
}
+想象一下,我们首先将要测量的数量(称为 n )放在天平的左侧。 这使得规模上的不平衡等于 n 。 想象一下,有某种方法可以测量 n 。 如果我们一次将一个重量放在秤上,我们可以查看第一个重量的放置位置(假设它的重量为 w )。 它必须:
+
+- 向左走,使规模上的净不平衡 n + w ,或
+- 向右走,使规模上的净不平衡 n – w ,或
+- 根本不习惯,留下净不平衡 n 。
+
+如果确实有可能测量 n ,那么这三个选项之一必须是实现它的方法,即使我们不知道它是哪一个。 然后我们要问的问题是,是否有可能使用剩余的权重来衡量新的净失衡——我们可以递归地确定! 另一方面,如果无法测量 n ,那么无论我们选择哪个选项,我们都会发现没有办法使用剩余的权重来使一切平衡!
+如果我们递归地进行,我们在这里,我们需要考虑我们的基本情况。 我们可以选择的选项有很多。 一个简单的方法如下:假设我们根本没有任何重量,我们被要求查看是否可以不使用重量来测量某些重量。 在什么情况下我们可以这样做? 好吧,如果我们称重的东西有一个非零重量,我们就不可能测量它——把它放在秤上会使它倾斜到某一边,但这并不能告诉我们它有多少重量。 另一方面,如果我们称量的东西是完全失重的,那么把它放在秤上也不会导致它倾斜,让我们相信它确实是失重的! 因此,作为我们的基本情况,我们会说当我们减少到没有剩余权重时, ,我们可以精确测量n 如果 n = 0 。 考虑到这一点,这是我们的代码:
+递归解决找零问题
+不使用记忆的情况
+`从第一个硬币开始遍历,并穷举它的所有枚数,将其作为下一枚硬币的参数传递
+int fewestCoinsFor(int cents, const Set<int>& coins) {
/* Can't have a negative number of cents. */
if (cents < 0) {
error("You owe me money, not the other way around!");
}
/* Base case: You need no coins to give change for no cents. */
else if (cents == 0) {
return 0;
}
/* Base case: No coins exist. Then it's not possible to make the
* amount. In that case, give back a really large value as a
* sentinel.
*/
else if (coins.isEmpty()) {
return cents + 1;
}
/* Recursive case: Pick a coin, then try using each distinct number of
* copies of it that we can.
*/
else {
/* The best we've found so far. We initialize this to a large value so
* that it's replaced on the first iteration of the loop. Do you see
* why cents + 1 is a good choice?
*/
int bestSoFar = cents + 1;
/* Pick a coin. */
int coin = coins.first();
/* Try all amounts of it. */
for (int copies = 0; copies * coin <= cents; copies++) {
/* See what happens if we make this choice. Once we use this
* coin, we won't use the same coin again in the future.
*/
int thisChoice = copies + fewestCoinsFor(cents - copies * coin,
coins - coin);
/* Is this better than what we have so far? */
if (thisChoice < bestSoFar) {
bestSoFar = thisChoice;
}
}
/* Return whatever worked best. */
return bestSoFar;
}
}
+使用记忆进行优化
+/* How few coins are needed to make the total, given that we can only use
* coins from index startIndex and onward?
*/
int fewestCoinsRec(int cents, const Vector<int>& coins, int startIndex,Grid<int>& memo) {
/* Base case: You need no coins to give change for no cents. */
if (cents == 0) {
return 0;
}
/* Base case: No coins exist. Then it's not possible to make the
* amount. In that case, give back a really large value as a
* sentinel.
*/
else if (startIndex == coins.size()) {
return cents + 1;
}
/* Base case: We already know the answer. */
else if (memo[cents][startIndex] != -1) {
return memo[cents][startIndex];
}
/* Recursive case: Pick a coin, then try using each distinct number of
* copies of it that we can.
*/
else {
/* The best we've found so far. We initialize this to a large value so
* that it's replaced on the first iteration of the loop. Do you see
* why cents + 1 is a good choice?
*/
int bestSoFar = cents + 1;
/* Pick a coin. */
int coin = coins[startIndex];
/* Try all amounts of it. */
for (int copies = 0; copies * coin <= cents; copies++) {
/* See what happens if we make this choice. Once we use this
* coin, we won't use the same coin again in the future.
*/
int thisChoice = copies + fewestCoinsRec(cents - copies * coin,
coins, startIndex + 1,
memo);
/* Is this better than what we have so far? */
if (thisChoice < bestSoFar) {
bestSoFar = thisChoice;
}
}
/* Return whatever worked best. */
memo[cents][startIndex] = bestSoFar;
return bestSoFar;
}
}
int fewestCoinsFor(int cents, const Set<int>& coins) {
/* Can't have a negative number of cents. */
if (cents < 0) {
error("You owe me money, not the other way around!");
}
/* Convert from a Set<int> to a Vector<int> so we have a nice ordering
* on things.
*/
Vector<int> coinVec;
for (int coin: coins) {
coinVec += coin;
}
/* Build our memoization table. Since the number of cents left ranges from
* 0 to cents, we need cents+1 rows. Since the start index of the coin
* ranges from 0 to coins.size(), we make coins.size() + 1 columns.
*
* -1 is used as a sentinel to indicate "nothing has been computed here
* yet."
*/
Grid<int> memo(cents + 1, coins.size() + 1, -1);
/* Now ask how many coins are needed to make the total, using any coins
* from index 0 onward.
*/
return fewestCoinsRec(cents, coinVec, 0, memo);
}
+递归穷举付账单
+递归机制:对第一个人来说,0-total所有金额都会付一遍,随后传递给下一个人,当只有一人时,付清所有余额并打印账单 传递参数:string,int的映射存储目前为止的账单,string集合存储所有付账者
+void listPossiblePaymentsRec(int total, const Set<string>& people,const Map<string, int>& payments) {
/* Base case: if there's one person left, they have to pay the whole bill. */
if (people.size() == 1) {
Map<string, int> finalPayments = payments;
finalPayments[people.first()] = total;
cout << finalPayments << endl;
}
/* Recursive case: The first person has to pay some amount between 0 and the
* total amount. Try all of those possibilities.
*/
else {
for (int payment = 0; payment <= total; payment++) {
/* Create a new assignment of people to payments in which this first
* person pays this amount.
*/
Map<string, int> updatedPayments = payments;
updatedPayments[people.first()] = payment;
listPossiblePaymentsRec(total - payment, people - people.first(),updatedPayments);
}
}
}
void listPossiblePayments(int total, const Set<string>& people) {
/* Edge cases: we can't pay a negative total, and there must be at least one
* person.
*/
if (total < 0) error("Guess you're an employee?");
if (people.isEmpty()) error("Dine and dash?");
listPossiblePaymentsRec(total, people, {});
}
+递归寻找完全平方数列
+主要参数为sofar——用于存储目前的序列和一个set用于存储还没放入数列的数字,`确保这两者同时被传递,且其并集为所有数字
+Optional<Vector<int>> findSquareSequence(int n) {
/*Validate input.*/
if (n < 0) {
error("Don't be so negative!");
}
/* Build a set of the numbers 1, 2, 3, ..., n. */
Set<int> options;
for (int i = 1; i <= n; i++) {
options += i;
}
return findSequenceRec(options, { });
}
Optional<Vector<int>> findSequenceRec(const Set<int>& unused,
const Vector<int>& soFar) {
/*Base Case: If all numbers are used, we have our sequence!*/
if (unused.isEmpty()) {
return soFar;
}
/* Recursive Case: Some number comes next. Try each of them and see which
* one we should pick.
*/
for (int next: unused) {
/* We can use this if either
*
* 1. the sequence is empty, so we're first in line, or
* 2. the sequence is not empty, but we sum to a perfect square
* with the previous term.
*/
if (soFar.isEmpty() ||
isPerfectSquare(next + soFar[soFar.size() - 1])) {
/* See what happens if we extend with this number. */
auto result = findSequenceRec(unused - next, soFar + next);
if (result != Nothing) {
return result;
}
}
}
/* Tried all options and none of them worked. Oh well! */
return Nothing;
}
+汉诺塔递归
+假设有三座汉诺塔,start ,temp ,finish
对n层的汉诺塔问题,先考虑n-1层的,随后考虑n-2层,到最后只需要考虑两层问题,两层的汉诺塔非常容易解决,起点为start,终点是temp,临时塔为finish,最后我们得到temp上的两层汉诺塔 这时将start的3移动到finish塔,这时只要将两层汉诺塔转移到finish则完成了三层汉诺塔,这个过程中的起点为temp,终点是finish,临时塔是start 以此类推,四层塔基于三层塔,n
层塔基于n-1
塔,汉诺塔问题解决
+int moveTower(int numDisks, char start, char finish, char temp) {
if (numDisks == 0) {
return 0;
} else {
int movesOne = moveTower(numDisks - 1, start, temp, finish);
moveSingleDisk(start, finish);
int movesTwo = moveTower(numDisks - 1, temp, finish, start);
return 1 + movesOne + movesTwo;
}
}
+]]>
+
+ 课程笔记
+ 数据结构与算法
+
+
+ 课程笔记
+ 数据结构与算法
+ c++
+ 斯坦福
diff --git a/sitemap.txt b/sitemap.txt
index 648ce9986..5aff88471 100644
--- a/sitemap.txt
+++ b/sitemap.txt
@@ -32,9 +32,9 @@ https://thinklive1.github.io/thinklive/28990/
https://thinklive1.github.io/thinklive/33908/
https://thinklive1.github.io/thinklive/14434/
https://thinklive1.github.io/thinklive/28549/
-https://thinklive1.github.io/thinklive/16615/
-https://thinklive1.github.io/thinklive/48468/
https://thinklive1.github.io/thinklive/15197/
+https://thinklive1.github.io/thinklive/48468/
+https://thinklive1.github.io/thinklive/16615/
https://thinklive1.github.io/thinklive/11069/
https://thinklive1.github.io/categories/index.html
https://thinklive1.github.io/about/index.html
@@ -49,9 +49,9 @@ https://thinklive1.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%
https://thinklive1.github.io/tags/JAVA/
https://thinklive1.github.io/tags/%E6%B8%B8%E6%88%8F%E6%9D%82%E8%B0%88/
https://thinklive1.github.io/tags/black-souls/
-https://thinklive1.github.io/tags/%E6%96%AF%E5%9D%A6%E7%A6%8F/
-https://thinklive1.github.io/tags/c/
https://thinklive1.github.io/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/
+https://thinklive1.github.io/tags/c/
+https://thinklive1.github.io/tags/%E6%96%AF%E5%9D%A6%E7%A6%8F/
https://thinklive1.github.io/tags/java/
https://thinklive1.github.io/tags/web%E5%BC%80%E5%8F%91/
https://thinklive1.github.io/tags/%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6/
@@ -60,7 +60,6 @@ https://thinklive1.github.io/tags/%E9%BA%BB%E7%9C%81%E7%90%86%E5%B7%A5/
https://thinklive1.github.io/tags/%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6/
https://thinklive1.github.io/tags/linux/
https://thinklive1.github.io/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/
-https://thinklive1.github.io/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/
https://thinklive1.github.io/tags/vim/
https://thinklive1.github.io/tags/wrpg/
https://thinklive1.github.io/tags/%E9%BE%99%E8%85%BE%E4%B8%96%E7%BA%AA/
@@ -69,30 +68,31 @@ https://thinklive1.github.io/tags/408/
https://thinklive1.github.io/tags/%E5%BD%B1%E5%AD%90%E5%B7%A5%E5%8E%82/
https://thinklive1.github.io/tags/%E4%B8%8D%E4%BA%88%E6%92%AD%E5%87%BA/
https://thinklive1.github.io/tags/%E6%AD%A5%E8%A1%8C%E6%A8%A1%E6%8B%9F%E5%99%A8/
+https://thinklive1.github.io/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/
+https://thinklive1.github.io/tags/%E8%8B%8F%E5%B7%9E%E5%A4%A7%E5%AD%A6/
+https://thinklive1.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
+https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/
https://thinklive1.github.io/tags/hexo/
https://thinklive1.github.io/tags/next/
https://thinklive1.github.io/tags/webstack/
https://thinklive1.github.io/tags/icarus/
-https://thinklive1.github.io/tags/%E8%8B%8F%E5%B7%9E%E5%A4%A7%E5%AD%A6/
-https://thinklive1.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
-https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/
https://thinklive1.github.io/tags/%E7%A7%98%E5%AF%86/
https://thinklive1.github.io/tags/%E8%AE%A1%E7%BB%84/
-https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
https://thinklive1.github.io/tags/%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%AD%A6/
+https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
https://thinklive1.github.io/tags/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
https://thinklive1.github.io/categories/%E8%80%83%E7%A0%94%E7%AC%94%E8%AE%B0/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/
https://thinklive1.github.io/categories/%E6%B8%B8%E6%88%8F%E6%9D%82%E8%B0%88/
-https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%85%B6%E4%BB%96/
+https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/web%E5%BC%80%E5%8F%91/
https://thinklive1.github.io/categories/%E6%B8%B8%E6%88%8F%E6%9D%82%E8%B0%88/black-souls/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
-https://thinklive1.github.io/categories/%E5%BB%BA%E7%AB%99%E7%BB%8F%E9%AA%8C/
https://thinklive1.github.io/categories/%E5%A4%87%E5%BF%98%E5%BD%95/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%BB%84/
+https://thinklive1.github.io/categories/%E5%BB%BA%E7%AB%99%E7%BB%8F%E9%AA%8C/
https://thinklive1.github.io/categories/%E7%A7%98%E5%AF%86/
-https://thinklive1.github.io/categories/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
+https://thinklive1.github.io/categories/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
diff --git a/sitemap.xml b/sitemap.xml
index e6a75bb78..449985c64 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -308,7 +308,7 @@
- https://thinklive1.github.io/thinklive/16615/
+ https://thinklive1.github.io/thinklive/15197/
2023-11-27
@@ -326,7 +326,7 @@
- https://thinklive1.github.io/thinklive/15197/
+ https://thinklive1.github.io/thinklive/16615/
2023-11-27
@@ -445,7 +445,7 @@
- https://thinklive1.github.io/tags/%E6%96%AF%E5%9D%A6%E7%A6%8F/
+ https://thinklive1.github.io/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/
2024-07-21
weekly
0.2
@@ -459,7 +459,7 @@
- https://thinklive1.github.io/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/
+ https://thinklive1.github.io/tags/%E6%96%AF%E5%9D%A6%E7%A6%8F/
2024-07-21
weekly
0.2
@@ -521,13 +521,6 @@
0.2
-
- https://thinklive1.github.io/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/
- 2024-07-21
- weekly
- 0.2
-
-
https://thinklive1.github.io/tags/vim/
2024-07-21
@@ -585,49 +578,56 @@
- https://thinklive1.github.io/tags/hexo/
+ https://thinklive1.github.io/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/next/
+ https://thinklive1.github.io/tags/%E8%8B%8F%E5%B7%9E%E5%A4%A7%E5%AD%A6/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/webstack/
+ https://thinklive1.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/icarus/
+ https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/%E8%8B%8F%E5%B7%9E%E5%A4%A7%E5%AD%A6/
+ https://thinklive1.github.io/tags/hexo/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
+ https://thinklive1.github.io/tags/next/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/
+ https://thinklive1.github.io/tags/webstack/
+ 2024-07-21
+ weekly
+ 0.2
+
+
+
+ https://thinklive1.github.io/tags/icarus/
2024-07-21
weekly
0.2
@@ -648,14 +648,14 @@
- https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
+ https://thinklive1.github.io/tags/%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%AD%A6/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%AD%A6/
+ https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
2024-07-21
weekly
0.2
@@ -692,14 +692,14 @@
- https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/
+ https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%85%B6%E4%BB%96/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%85%B6%E4%BB%96/
+ https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/
2024-07-21
weekly
0.2
@@ -734,21 +734,21 @@
- https://thinklive1.github.io/categories/%E5%BB%BA%E7%AB%99%E7%BB%8F%E9%AA%8C/
+ https://thinklive1.github.io/categories/%E5%A4%87%E5%BF%98%E5%BD%95/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/categories/%E5%A4%87%E5%BF%98%E5%BD%95/
+ https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%BB%84/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%BB%84/
+ https://thinklive1.github.io/categories/%E5%BB%BA%E7%AB%99%E7%BB%8F%E9%AA%8C/
2024-07-21
weekly
0.2
@@ -762,14 +762,14 @@
- https://thinklive1.github.io/categories/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
+ https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
+ https://thinklive1.github.io/categories/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
2024-07-21
weekly
0.2
diff --git a/steamgames/index.html b/steamgames/index.html
index 09622bb94..f0de46a8f 100644
--- a/steamgames/index.html
+++ b/steamgames/index.html
@@ -6305,14 +6305,14 @@ Steam游戏库
站点总字数:
- 723k
+ 386k
diff --git a/tags/408/index.html b/tags/408/index.html
index 3e9d5e4a3..b00a89a8b 100644
--- a/tags/408/index.html
+++ b/tags/408/index.html
@@ -321,14 +321,14 @@ 408
站点总字数:
- 723k
+ 386k
diff --git a/tags/JAVA/index.html b/tags/JAVA/index.html
index 3535f4cd0..665e5c70a 100644
--- a/tags/JAVA/index.html
+++ b/tags/JAVA/index.html
@@ -321,14 +321,14 @@ JAVA
站点总字数:
- 723k
+ 386k
diff --git a/tags/black-souls/index.html b/tags/black-souls/index.html
index 443b2d205..238144fe5 100644
--- a/tags/black-souls/index.html
+++ b/tags/black-souls/index.html
@@ -306,8 +306,8 @@ black souls
@@ -326,8 +326,8 @@ black souls
@@ -361,14 +361,14 @@ black souls
站点总字数:
- 723k
+ 386k
diff --git a/tags/c/index.html b/tags/c/index.html
index 274c8a36b..b3fdea309 100644
--- a/tags/c/index.html
+++ b/tags/c/index.html
@@ -286,8 +286,8 @@ c++
@@ -326,8 +326,8 @@ c++
@@ -361,14 +361,14 @@ c++
站点总字数:
- 723k
+ 386k
diff --git a/tags/hexo/index.html b/tags/hexo/index.html
index 7637de58f..c2fa827b9 100644
--- a/tags/hexo/index.html
+++ b/tags/hexo/index.html
@@ -321,14 +321,14 @@ hexo
站点总字数:
- 723k
+ 386k
diff --git a/tags/icarus/index.html b/tags/icarus/index.html
index b092f872a..2ac9d8d3a 100644
--- a/tags/icarus/index.html
+++ b/tags/icarus/index.html
@@ -321,14 +321,14 @@ icarus
站点总字数:
- 723k
+ 386k
diff --git a/tags/index.html b/tags/index.html
index 083550ed0..2cef7d3f2 100644
--- a/tags/index.html
+++ b/tags/index.html
@@ -314,14 +314,14 @@ tags
站点总字数:
- 723k
+ 386k
diff --git a/tags/java/index.html b/tags/java/index.html
index 232383f7e..3d5894041 100644
--- a/tags/java/index.html
+++ b/tags/java/index.html
@@ -321,14 +321,14 @@ java
站点总字数:
- 723k
+ 386k
diff --git a/tags/linux/index.html b/tags/linux/index.html
index 42ea07c45..3f4a65c20 100644
--- a/tags/linux/index.html
+++ b/tags/linux/index.html
@@ -361,14 +361,14 @@ linux
站点总字数:
- 723k
+ 386k
diff --git a/tags/next/index.html b/tags/next/index.html
index 8523a947c..020845b37 100644
--- a/tags/next/index.html
+++ b/tags/next/index.html
@@ -321,14 +321,14 @@ next
站点总字数:
- 723k
+ 386k
diff --git a/tags/pandas/index.html b/tags/pandas/index.html
index 5195812a6..f0476a43e 100644
--- a/tags/pandas/index.html
+++ b/tags/pandas/index.html
@@ -341,14 +341,14 @@ pandas
站点总字数:
- 723k
+ 386k
diff --git a/tags/python/index.html b/tags/python/index.html
index e067a2fe2..43f8df910 100644
--- a/tags/python/index.html
+++ b/tags/python/index.html
@@ -381,14 +381,14 @@ python
站点总字数:
- 723k
+ 386k
diff --git a/tags/vim/index.html b/tags/vim/index.html
index 7da40a5a0..ceb40cc71 100644
--- a/tags/vim/index.html
+++ b/tags/vim/index.html
@@ -321,14 +321,14 @@ vim
站点总字数:
- 723k
+ 386k
diff --git a/tags/webstack/index.html b/tags/webstack/index.html
index 26c0de670..d10bf66ef 100644
--- a/tags/webstack/index.html
+++ b/tags/webstack/index.html
@@ -321,14 +321,14 @@ webstack
站点总字数:
- 723k
+ 386k
diff --git "a/tags/web\345\274\200\345\217\221/index.html" "b/tags/web\345\274\200\345\217\221/index.html"
index ff2d81204..a8cd13b9d 100644
--- "a/tags/web\345\274\200\345\217\221/index.html"
+++ "b/tags/web\345\274\200\345\217\221/index.html"
@@ -321,14 +321,14 @@ web开发
站点总字数:
- 723k
+ 386k
diff --git a/tags/wrpg/index.html b/tags/wrpg/index.html
index 0e0324c3a..134b41f12 100644
--- a/tags/wrpg/index.html
+++ b/tags/wrpg/index.html
@@ -321,14 +321,14 @@ wrpg
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\344\270\215\344\272\210\346\222\255\345\207\272/index.html" "b/tags/\344\270\215\344\272\210\346\222\255\345\207\272/index.html"
index af1d2075e..4d987a666 100644
--- "a/tags/\344\270\215\344\272\210\346\222\255\345\207\272/index.html"
+++ "b/tags/\344\270\215\344\272\210\346\222\255\345\207\272/index.html"
@@ -321,14 +321,14 @@ 不予播出
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\344\270\255\345\233\275\347\247\221\345\255\246\346\212\200\346\234\257\345\244\247\345\255\246/index.html" "b/tags/\344\270\255\345\233\275\347\247\221\345\255\246\346\212\200\346\234\257\345\244\247\345\255\246/index.html"
index 5a8a0bc86..41feff02a 100644
--- "a/tags/\344\270\255\345\233\275\347\247\221\345\255\246\346\212\200\346\234\257\345\244\247\345\255\246/index.html"
+++ "b/tags/\344\270\255\345\233\275\347\247\221\345\255\246\346\212\200\346\234\257\345\244\247\345\255\246/index.html"
@@ -321,14 +321,14 @@ 中国科学技术大学
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\344\274\257\345\205\213\345\210\251/index.html" "b/tags/\344\274\257\345\205\213\345\210\251/index.html"
index b63fa1f2e..020c1533d 100644
--- "a/tags/\344\274\257\345\205\213\345\210\251/index.html"
+++ "b/tags/\344\274\257\345\205\213\345\210\251/index.html"
@@ -401,14 +401,14 @@ 伯克利
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\345\214\227\344\272\254\345\244\247\345\255\246/index.html" "b/tags/\345\214\227\344\272\254\345\244\247\345\255\246/index.html"
index 6eb41d8ed..ee1fa3272 100644
--- "a/tags/\345\214\227\344\272\254\345\244\247\345\255\246/index.html"
+++ "b/tags/\345\214\227\344\272\254\345\244\247\345\255\246/index.html"
@@ -341,14 +341,14 @@ 北京大学
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\345\267\253\345\270\2102/index.html" "b/tags/\345\267\253\345\270\2102/index.html"
index 25e1d7e97..5fdcb5404 100644
--- "a/tags/\345\267\253\345\270\2102/index.html"
+++ "b/tags/\345\267\253\345\270\2102/index.html"
@@ -321,14 +321,14 @@ 巫师2
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\345\275\261\345\255\220\345\267\245\345\216\202/index.html" "b/tags/\345\275\261\345\255\220\345\267\245\345\216\202/index.html"
index eb36ac427..8b2ac46fb 100644
--- "a/tags/\345\275\261\345\255\220\345\267\245\345\216\202/index.html"
+++ "b/tags/\345\275\261\345\255\220\345\267\245\345\216\202/index.html"
@@ -321,14 +321,14 @@ 影子工厂
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" "b/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html"
index f94d65eb6..fa96d99ad 100644
--- "a/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html"
+++ "b/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html"
@@ -344,14 +344,14 @@ 操作系统
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\225\260\346\215\256\347\247\221\345\255\246/index.html" "b/tags/\346\225\260\346\215\256\347\247\221\345\255\246/index.html"
index 5a42d5662..c7c2698c6 100644
--- "a/tags/\346\225\260\346\215\256\347\247\221\345\255\246/index.html"
+++ "b/tags/\346\225\260\346\215\256\347\247\221\345\255\246/index.html"
@@ -361,14 +361,14 @@ 数据科学
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html" "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html"
index 3c1461713..393636305 100644
--- "a/tags/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html"
+++ "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html"
@@ -424,14 +424,14 @@ 数据结构与算法
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\226\257\345\235\246\347\246\217/index.html" "b/tags/\346\226\257\345\235\246\347\246\217/index.html"
index 5ccf61628..1b679364e 100644
--- "a/tags/\346\226\257\345\235\246\347\246\217/index.html"
+++ "b/tags/\346\226\257\345\235\246\347\246\217/index.html"
@@ -286,8 +286,8 @@ 斯坦福
@@ -306,8 +306,8 @@ 斯坦福
@@ -341,14 +341,14 @@ 斯坦福
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\255\245\350\241\214\346\250\241\346\213\237\345\231\250/index.html" "b/tags/\346\255\245\350\241\214\346\250\241\346\213\237\345\231\250/index.html"
index 9140b5997..b59583357 100644
--- "a/tags/\346\255\245\350\241\214\346\250\241\346\213\237\345\231\250/index.html"
+++ "b/tags/\346\255\245\350\241\214\346\250\241\346\213\237\345\231\250/index.html"
@@ -321,14 +321,14 @@ 步行模拟器
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" "b/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html"
index d8320aa7b..09d2f3f2e 100644
--- "a/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html"
+++ "b/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html"
@@ -326,8 +326,8 @@ 游戏杂谈
@@ -346,8 +346,8 @@ 游戏杂谈
@@ -381,14 +381,14 @@ 游戏杂谈
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\347\240\224distance/index.html" "b/tags/\347\240\224distance/index.html"
index 4117cba6a..685625ce3 100644
--- "a/tags/\347\240\224distance/index.html"
+++ "b/tags/\347\240\224distance/index.html"
@@ -364,14 +364,14 @@ 研distance
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\347\247\230\345\257\206/index.html" "b/tags/\347\247\230\345\257\206/index.html"
index 53c96e27e..436891d64 100644
--- "a/tags/\347\247\230\345\257\206/index.html"
+++ "b/tags/\347\247\230\345\257\206/index.html"
@@ -404,14 +404,14 @@ 秘密
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\347\263\273\347\273\237\347\256\241\347\220\206/index.html" "b/tags/\347\263\273\347\273\237\347\256\241\347\220\206/index.html"
index 0cfc1c51b..199b096e7 100644
--- "a/tags/\347\263\273\347\273\237\347\256\241\347\220\206/index.html"
+++ "b/tags/\347\263\273\347\273\237\347\256\241\347\220\206/index.html"
@@ -321,14 +321,14 @@ 系统管理
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\347\274\226\347\250\213\345\267\245\345\205\267/index.html" "b/tags/\347\274\226\347\250\213\345\267\245\345\205\267/index.html"
index c1232f667..9a1a4db89 100644
--- "a/tags/\347\274\226\347\250\213\345\267\245\345\205\267/index.html"
+++ "b/tags/\347\274\226\347\250\213\345\267\245\345\205\267/index.html"
@@ -361,14 +361,14 @@ 编程工具
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\213\217\345\267\236\345\244\247\345\255\246/index.html" "b/tags/\350\213\217\345\267\236\345\244\247\345\255\246/index.html"
index c09741090..1e710a60a 100644
--- "a/tags/\350\213\217\345\267\236\345\244\247\345\255\246/index.html"
+++ "b/tags/\350\213\217\345\267\236\345\244\247\345\255\246/index.html"
@@ -381,14 +381,14 @@ 苏州大学
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/index.html" "b/tags/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/index.html"
index c393cba83..1bc574e90 100644
--- "a/tags/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/index.html"
+++ "b/tags/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/index.html"
@@ -321,14 +321,14 @@ 计算机组成
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" "b/tags/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html"
index bd0363426..16517d298 100644
--- "a/tags/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html"
+++ "b/tags/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html"
@@ -341,14 +341,14 @@ 计算机网络
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\256\241\347\273\204/index.html" "b/tags/\350\256\241\347\273\204/index.html"
index 82ca850b8..fa9d4ce16 100644
--- "a/tags/\350\256\241\347\273\204/index.html"
+++ "b/tags/\350\256\241\347\273\204/index.html"
@@ -321,14 +321,14 @@ 计组
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html"
index 6fff76549..bdb0e6e71 100644
--- "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html"
+++ "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html"
@@ -321,14 +321,14 @@ 读书笔记
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\257\276\347\250\213\347\254\224\350\256\260/index.html" "b/tags/\350\257\276\347\250\213\347\254\224\350\256\260/index.html"
index f880275ab..440d90dc2 100644
--- "a/tags/\350\257\276\347\250\213\347\254\224\350\256\260/index.html"
+++ "b/tags/\350\257\276\347\250\213\347\254\224\350\256\260/index.html"
@@ -326,8 +326,8 @@ 课程笔记
@@ -346,8 +346,8 @@ 课程笔记
@@ -466,8 +466,8 @@ 课程笔记
@@ -504,14 +504,14 @@ 课程笔记
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\257\276\347\250\213\347\254\224\350\256\260/page/2/index.html" "b/tags/\350\257\276\347\250\213\347\254\224\350\256\260/page/2/index.html"
index a720372cb..dee2e0d63 100644
--- "a/tags/\350\257\276\347\250\213\347\254\224\350\256\260/page/2/index.html"
+++ "b/tags/\350\257\276\347\250\213\347\254\224\350\256\260/page/2/index.html"
@@ -286,8 +286,8 @@ 课程笔记
@@ -404,14 +404,14 @@ 课程笔记
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\277\252\347\221\236\345\205\213\346\213\211/index.html" "b/tags/\350\277\252\347\221\236\345\205\213\346\213\211/index.html"
index 0b48f4470..90ce40855 100644
--- "a/tags/\350\277\252\347\221\236\345\205\213\346\213\211/index.html"
+++ "b/tags/\350\277\252\347\221\236\345\205\213\346\213\211/index.html"
@@ -286,8 +286,8 @@ 迪瑞克拉
@@ -306,8 +306,8 @@ 迪瑞克拉
@@ -364,14 +364,14 @@ 迪瑞克拉
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\351\272\273\347\234\201\347\220\206\345\267\245/index.html" "b/tags/\351\272\273\347\234\201\347\220\206\345\267\245/index.html"
index 95bb7d01f..8ba98bced 100644
--- "a/tags/\351\272\273\347\234\201\347\220\206\345\267\245/index.html"
+++ "b/tags/\351\272\273\347\234\201\347\220\206\345\267\245/index.html"
@@ -381,14 +381,14 @@ 麻省理工
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\351\276\231\350\205\276\344\270\226\347\272\252/index.html" "b/tags/\351\276\231\350\205\276\344\270\226\347\272\252/index.html"
index 45331eb6a..25509a1ac 100644
--- "a/tags/\351\276\231\350\205\276\344\270\226\347\272\252/index.html"
+++ "b/tags/\351\276\231\350\205\276\344\270\226\347\272\252/index.html"
@@ -321,14 +321,14 @@ 龙腾世纪
站点总字数:
- 723k
+ 386k
diff --git a/thanks/index.html b/thanks/index.html
index 1b609759f..50eaa80f5 100644
--- a/thanks/index.html
+++ b/thanks/index.html
@@ -316,14 +316,14 @@ And you
站点总字数:
- 723k
+ 386k
diff --git a/thinklive/11069/index.html b/thinklive/11069/index.html
index e2ab16156..6c8f501b5 100644
--- a/thinklive/11069/index.html
+++ b/thinklive/11069/index.html
@@ -344,14 +344,14 @@
19k
+ 12k
-
@@ -731,14 +731,14 @@ 还有更多的 Vim 小窍门吗?
站点总字数:
- 723k
+ 386k
diff --git a/thinklive/11086/index.html b/thinklive/11086/index.html
index ea08aeb7e..2941006c4 100644
--- a/thinklive/11086/index.html
+++ b/thinklive/11086/index.html
@@ -344,14 +344,14 @@
3.7k
+ 2.5k
-
@@ -469,8 +469,8 @@ 进阶
@@ -504,14 +504,14 @@ 进阶
站点总字数:
- 723k
+ 386k
diff --git a/thinklive/14434/index.html b/thinklive/14434/index.html
index f8fde1b22..a788604e8 100644
--- a/thinklive/14434/index.html
+++ b/thinklive/14434/index.html
@@ -333,14 +333,14 @@
2.4k
+ 2.1k
-
@@ -424,13 +424,13 @@ 度量
@@ -464,14 +464,14 @@ 度量
站点总字数:
- 723k
+ 386k
diff --git a/thinklive/15197/index.html b/thinklive/15197/index.html
index 6b29350f2..3f2a316d6 100644
--- a/thinklive/15197/index.html
+++ b/thinklive/15197/index.html
@@ -32,8 +32,8 @@
-
+
@@ -338,14 +338,14 @@
5.9k
+ 3.2k
-
@@ -466,8 +466,8 @@ 匿名函数
一些查找和排序算法
-二分查找法 最坏情况:log2n +
c语言部分
+基本函数构成
+将数组传递为函数参数
+1 | int fcname(int arg[],int n) |
3.3k + 1.4k
-c++特性
- 基于c++ primer plus的读书笔记 + 基于斯坦福cs106b的c++数据结构笔记
@@ -799,13 +801,11 @@
- c语言部分
-基本函数构成
-将数组传递为函数参数
-1
int fcname(int arg[],int n)
+ 一些查找和排序算法
+二分查找法 最坏情况:log2n
@@ -895,14 +895,14 @@
19k
+ 12k
-
@@ -970,14 +970,14 @@ 简介
站点总字数:
- 723k
+ 386k
diff --git a/photos/index.html b/photos/index.html
index c3dd68d7d..43984f296 100644
--- a/photos/index.html
+++ b/photos/index.html
@@ -335,14 +335,14 @@ 2024年贺图
站点总字数:
- 723k
+ 386k
diff --git a/search.xml b/search.xml
index f9aa93db7..76ec208d7 100644
--- a/search.xml
+++ b/search.xml
@@ -512,6 +512,17 @@ wars, wars never change
不过还有更好的方法吗?杀了一个人的人就必须死?如果过失杀人呢?故意杀人必须死?如果被杀人曾害杀人者妻离子散呢?没有仇怨杀人必须死?如果被杀者身上有传染病,不烧掉尸体就会让周边化为地狱呢?杀好人必须死?如果好人只是伪装,私底下男盗女娼呢?
无论如何都很难归纳出绝对正确的可以杀人的场合,因此只能这么说,只要行动,就会有犯下罪孽的可能性,即使什么都不做也是一样,归根到底,道德议题都会是虚无的,只有圈定一个前提,才能讨论一个局部解,那么不同群体的局部解又会不同
因此,只要杀人都是罪,这种观点未必对也未必错,无法证实也无法证伪,只是一个观点,如果说这种观点错,同样也可以否定其他观点,这就是为什么人类文明发展到现在也依旧有无数的罪恶
+复仇篇的发展远比英雄篇好猜,正义,英雄,这种概念是人类社会出现后才慢慢成型的事物,复仇则在更早之前就会出现
+证据就是,我小时候收养了流浪狗,不服管教被我妈追着打过,因此它一看到我妈就夹着尾巴,这是恐惧,畏惧,但到了适当的时候就会产生仇恨,仇恨就是这样一种原始的感情,例如农村的狗对着闯进领地的人狂叫,也是对侵占领地这种行为的“复仇”
+复仇只要伴随着生物本能就可以完成,这样的简单粗暴让其很多时候都不符合道德标准,正义更无从谈起,但作为人性中残留的兽性,这是必不可少的
+因此,复仇没什么好绕的,只要去杀戮就行了,但为什么哈姆雷特这样的人会犹豫呢?这不过是因为他当了太久的人,忘了怎么当裸猿,也就是说复仇很简单,复不复仇才是麻烦的地方,脱下人皮经典,再穿上又难了
+我是很不擅长阅读理解的那类人,语文很难考到平均分,因此我一般也看不出作者有什么私货,除了硬塞lgbt,黑龙也是龙这种太夸张的,因为我懒得猜作者到底什么意思,所以反而是最宽容的一类读者,对我来说作者写完的一瞬间,作品的解释权就被我这个读者垄断了,作者想要解释作品也只能以一个读者的身份来
+因此我倒不觉得村正反战败,我看出的是反杀人,杀任何人都有可能杀错,所以不要杀比较好,这种说法很极端,因为别人打不过了的话难道不反抗吗?所以这个说法还有补丁,心怀大爱的人就不要反抗,以肉饲鹰,没有这么高尚的人以牙还牙也无所谓,只是不要觉得自己就是对的。这样说完了还是很极端,难道世界上不存在正义的战争,怎么就不能觉得自己是正义的?但是还有补丁,这是从宏观视角看的,因为缺少前提的情况下,恶人的一命和善人的一命没有方法裁量,善与恶也难以分辨,这个前提取决于不同的人和不同的价值观,也就是换一个朴素正义感的视角,善人杀恶人就是天经地义的正义。
+这就绕了个大圈子回到了现实世界,为什么要这么麻烦呢,或者说为什么要这么极端呢?因为村正是为了醋包饺子,世界观下平民几乎没有半点希望,单人的武力可以灭国,毫无节制的强,你杀我我杀你,没几轮地球上就没人了,在这种特定情况下,很难说需不需要社会的存在,也很难说什么是道德准则,武力的使用会产生冲突,稍微多冲突几次地球就没人了,你以一个平民的视角看,不要使用任何武力也是个不错的结果,平民和那些超能力者已经不是同类了
+绕到这种程度还是很极端,为什么就要因噎废食,说不定在地球没人前,正义的超人们把邪恶方杀完了,又可以建立一个天国。这当然也可以,唯一的问题是会死人,死掉很多无辜的人,也未必能成功,对那些,比如流弹打死的人来说,正义又成了邪恶
+到最后我们就会发现一个朴素的道理,好人一次也不能出错,否则就成了恶人,村正部分角色的观点是,好人难做,那就什么都不做好了,或者以当恶人的觉悟去做好事
+论证到这个结论,还是很极端,因为好心干了坏事的好人也可以认为还是好人,好人战斗死的人很可能比不战斗死的人少,更何况可能真的有超人,永远好心干好事,这样的论证逐渐开始虚无了,因为这样的假设可以无数次做下去
+因此以上的一切只会是观点,无法像数学证明题一样完美的QED,同理,认为有私货的人也只是观点,我也可以假设作者的所想和我这些观点一样几乎等于什么都没说,因为换个类似现实的世界观一切就不同了
]]>
游戏杂谈
@@ -11758,160 +11769,6 @@ Inexpensive Disk)由美国加州大学伯克利分校提出。
数据结构与算法
-
- 基于斯坦福cs106b的c++数据结构笔记
- /thinklive/16615/
- 一些查找和排序算法
-二分查找法 最坏情况:log2n 寻找最小排序 向前插入算法
-合并算法接受两个排序的 列出并将它们组合成一个 排序列表。 ● 虽然两个列表都是非空的,但比较它们的 第一要素。 删除较小的元素 并将其附加到输出。 ● 一旦一个列表为空,添加所有元素 另一个列表输出。 ● 它运行时间为 O(n),其中 n 是总数 合并的元素数量。 无限递归后的合并算法 复杂度:nlog2n
-容器类
-set(集合):无序不允许重复的容器类,可以添加删除元素 You can add a value to a Set by writing set += value; s. ● You can remove a value from a Set by writing set -= value; ● You can check if a value exists in a Set by writing set.contains(value)
map(键值对的集合) 如果没有对应key的value,返回默认值(见定义文件) `vector vector的remove根据移除元素的索引有1-n的复杂度,移除尾部为O(1),如果不在意索引,可以交换要移除元素和尾部元素再移除
-哈希表
-哈希表的负载因子α表示元素和表格键数量的比,决定了查找速度
-检查表中是否存在元素
-● 计算元素的散列码。 ● 跳转到表格中的那个位置。 ● 向前扫描——必要时环绕——直到项目或一个 发现空插槽。
-将元素插入表中
-● 如果项目已经存在,什么也不做。 ● 否则,跳转到元素哈希码给定的槽。 向前走——必要时环绕——直到一个空白点或 找到墓碑插槽。 然后,将项目放在那里。
-从表中删除一个元素
-● 跳转到由元素的散列码给定的槽。 ● 向前走——必要时环绕——直到物品或 发现空插槽。 如果找到该项目,请将其替换为 墓碑。
-“罗宾汉哈希表”
-
-- 如果插入的值比其将插入的位置的值距离索引更远,则替换插入值和当前值
-- 删除值时,将后其离原键远的元素前移
-- ★ 罗宾汉哈希一览 ★
-- 检查表中是否存在元素:
-- ● 跳转到表中由元素的散列码给出的位置。
-- ● 向前扫描——如有必要环绕——记录有多少步 你拿走了。 当您找到该项目、找到一个空白槽或找到一个 离家更近的空位比你走的步数还多。
-- 将元素插入表中:
-- ● 如果该元素已在表中,则什么也不做。
-- ● 跳转到由元素的散列码给出的表槽。 向前扫描 - 换行 如有必要,四处走走——记录所走的步数。 如果你找到一个 空插槽,将元素放在那里。 否则,如果当前插槽已满并且 比您插入的元素更靠近家,将要插入的项目放在那里, 替换那个位置的元素,然后继续插入,就好像你 正在插入被置换的元素。
-- 从表中删除一个元素:
-- ● 跳转到由元素的散列码给定的槽。
-- ● 向前走——如有必要,环绕——直到物品或空槽被放置 成立。 如果找到该项目,请将其删除。 然后,继续前进——包裹 around as necessary – 将表中的元素向后移动一个槽位,直到 找到空插槽或位于其原始位置的项目
-
-string类
-str::npos表示容器的最后一个成员位置 if (s.find("e") != string::npos) //find函数找不到时返回npos if s in str: string obj; obj.substr(int pos) //pos为要包含的第一个字符串的位置 std::string a = "0123456789abcdefghij";
-
// count is npos, returns [pos, size())
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub1 = a.substr(10);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub1 << '\n';
// both pos and pos+count are within bounds, returns [pos, pos+count)
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub2 = a.substr(5, 3);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub2 << '\n';
// pos is within bounds, pos+count is not, returns [pos, size())
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub4 = a.substr(a.size()-3, 50);
// this is effectively equivalent to
// std::string sub4 = a.substr(17, 3);
// since a.size() == 20, pos == a.size()-3 == 17, and a.size()-pos == 3
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub4 << '\n';
try {
// pos is out of bounds, throws
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub5 = a.substr(a.size()+3, 50);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub5 << '\n';
} catch(const [std::out_of_range](http://en.cppreference.com/w/cpp/error/out_of_range)& e) {
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << "pos exceeds string size\n";
}
}
输出:
abcdefghij
567
hij
pos exceeds string size
-`replace和insert str1.insert(start, str2) str1.replace(start, length, str2)
-一些实现
-优先队列
-# include "HeapPQueue.h"
using namespace std;
HeapPQueue::HeapPQueue() {
elems = new DataPoint[INITIAL_SIZE] {};
for (int i=0;i<INITIAL_SIZE;i++)
{
elems[i].weight=0;
}
allocatedSize=INITIAL_SIZE;
}
HeapPQueue::~HeapPQueue() {
delete [] elems;
}
int HeapPQueue::size() const {
return logicalSize;
}
bool HeapPQueue::isEmpty() const {
return logicalSize==0;
}
void HeapPQueue::enqueue(const DataPoint& data) {
if (logicalSize+1<allocatedSize)
{
if (logicalSize==0)
{
elems[1]=data;
logicalSize++;
}
else
{
logicalSize++;
int i=1;
while (data.weight>elems[i].weight && i<=logicalSize && elems[i].weight!=0)
{
i++;
}
if (i<logicalSize)
{
DataPoint temp=elems[i];
elems[i]=data;
for(i;i<logicalSize;i++)
{
DataPoint temp_plus=elems[i+1];
elems[i+1]=temp;
temp=temp_plus;
}
}
else
{
elems[i]=data;
}
}
}
}
DataPoint HeapPQueue::peek() const {
return elems[logicalSize];
}
DataPoint HeapPQueue::dequeue() {
DataPoint to_return=elems[1];
if(!isEmpty())
{
for (int i=1;i<logicalSize;i++)
{
elems[i]=elems[i+1];
}
elems[logicalSize]={};
logicalSize--;
}
return to_return;
}
-计数排序
-首先算出最大值,然后用一个数组的索引存储待排序数组的成员,其索引对应值存储出现次数,然后用两个同步的for循环和递增的next参数表示排序中的索引值来进行排序(也就是重新赋值)
-/* Given a Vector<int>, returns the largest number in that Vector. */
int maxOf(const Vector<int>& values) {
/* Bounds-check inputs. */
if (values.isEmpty()) {
error("Can't find the maximum of no values.");
}
int result = values[0];
for (int i = 1; i < values.size(); i++) {
result = max(result, values[i]);
}
return result;
}
/* Given a list of numbers, creates a histogram from those numbers. */
Vector<int> histogramFor(const Vector<int>& values) {
/* Create a histogram with the right number of slots. Initially, all values
* in the histogram will be zero.
*/
Vector<int> histogram(maxOf(values) + 1);
/* Scan across the input vector, incrementing the histogram values. */
for (int value: values) {
histogram[value]++;
}
return histogram;
}
void countingSort(Vector<int>& values) {
/* Edge Case: If the array is empty, then it's already sorted. This is
* needed because we can't take the maximum value of an empty vector.
*/
if (values.isEmpty()) {
return;
}
/* Form the histogram. */
auto histogram = histogramFor(values);
/* Scan across the histogram writing out the appropriate number of copies
* of each value. We track the index of the next free spot to write to,
* as it varies based on how many items we've written out so far.
*/
int next = 0;
for (int value = 0; value < histogram.size(); value++) {
/* Write out the right number of copies. */
for (int copy = 0; copy < histogram[value]; copy++) {
values[next] = value;
next++;
}
}
}
-错题集
-递归的效率优化
-每次递归都会创造所有变量的临时复制 基于递归的这种性质,它会需要巨大的时间和空间来完成任务,并且会造成算力上的浪费。 通过记忆表机制能部分解决这个问题,方法是每次递归的返回值都会按索引存入一个表格,并且每次递归前查询表格中是否有结果,这样可以让每个临时副本的运算结果能被所有函数共享。
-递归计算给定元素的不同结构哈夫曼树的数量
-对每个给定元素集来说,首先要做到是确定根节点元素是第几个大的元素,确定之后,左子树和右子树的元素数也随之确定,在此之后分别对左节点和右节点作为根节点做同样的递归
-
int numBSTsOfSize(int n) {
/* Base case: There’s only one tree of size 0, namely, the empty BST. */
if (n == 0) return 1;
/* Recursive case: Imagine all possible ways to choose a root and build the
* left and right subtrees.
*/
int result = 0;
/* Put the the nodes at indices 0, 1, 2, ..., n-1 up at the root. */
for (int i = 0; i < n; i++) {
/* Each combination of a BST of i elements and a BST of n - 1 - i elements
* can be used to build one BST of n elements. The number of pairs of
* trees we can make this way is given by the product of the number of
* trees of each type.
*/
result += numBSTsOfSize(i) * numBSTsOfSize(n - 1 - i);
}
return result;
}
-递归解决吃巧克力问题
-求出吃法数量
-if (numSquares<0)
{
error("输入数据不能为负数");
}
else if (numSquares<=1)
{
return 1;
}
else
{
return numWaysToEat(numSquares-1)+numWaysToEat(numSquares-2);
}
-打印每种吃法
-`需要一个辅助向量储存历史记录
-/* Print all ways to eat numSquares more squares, given that we've
* already taken the bites given in soFar.
*/
void printWaysToEatRec(int numSquares, const Vector<int>& soFar) {
/* Base Case: If there are no squares left, the only option is to use
* the bites we've taken already in soFar.
*/
if (numSquares == 0) {
cout << soFar << endl;
}
/* Base Case: If there is one square lfet, the only option is to eat
* that square.
*/
else if (numSquares == 1) {
cout << soFar + 1 << endl;
}
/* Otherwise, we take take bites of size one or of size two. */
else {
printWaysToEatRec(numSquares - 1, soFar + 1);
printWaysToEatRec(numSquares - 2, soFar + 2);
}
}
void printWaysToEat(int numSquares) {
if (numSquares < 0) {
error("You owe me some chocolate!");
}
/* We begin without having made any bites. */
printWaysToEatRec(numSquares, {});
}
-递归解决翻煎饼问题
-bool isSorted(Stack<double> pancakes) {
double last = -1; // No pancakes have negative size;
while (!pancakes.isEmpty()) {
/* Check the next pancake. */
double next = pancakes.pop();
if (next < last) {
return false;
}
last = next;
}
/* Pancakes are in increasing order! */
return true;
}
/* Given a stack of pancakes and a flip size, flips that many pancakes
* on the top of the stack.
*/
Stack<double> flip(Stack<double> pancakes, int numToFlip) {
/* Take the top pancakes off the stack and run them into a queue.
* This preserves the order in which they were removed.
*/
Queue<double> buffer;
for (int i = 0; i < numToFlip; i++) {
buffer.enqueue(pancakes.pop());
}
/* Move the pancakes back. */
while (!buffer.isEmpty()) {
pancakes.push(buffer.dequeue());
}
return pancakes;
}
Optional<Vector<int>> sortStack(Stack<double> pancakes, int numFlips) {
/* Base Case: If the stack is sorted, great! We're done, and no flips
* were needed.
*/
if (isSorted(pancakes)) {
return { }; // No flips
}
/* Base Case: If the stack isn't sorted and we're out of flips, then
* there is no way to sort things.
*/
else if (numFlips == 0) {
return Nothing;
}
/* Recursive Case: The stack isn't sorted and we still have flips left.
* The next flip could flip 1, 2, 3, ..., or all N of the pancakes.
* Try each option and see whether any of them work.
*/
for (int numToFlip = 1; numToFlip <= pancakes.size(); numToFlip++) {
/* Make the flip and see if it works. */
auto result = sortStack(flip(pancakes, numToFlip), numFlips - 1);
if (result != Nothing) {
/* The result holds all the remaining flips but doesn't know about
* the flip we just did. Insert that flip at the beginning.
*/
result.value().insert(0, numToFlip);
return result;
}
}
/* If we're here, then no matter which flip we make first, we cannot
* get the pancakes sorted. Give up.
*/
return Nothing;
}
-递归解决天平问题
-bool isMeasurableRec(int amount, const Vector<int>& weights, int index) {
if (index == weights.size()) {
return amount == 0;
} else {
return isMeasurableRec(amount, weights, index + 1) ||
isMeasurableRec(amount + weights[index], weights, index + 1) ||
isMeasurableRec(amount - weights[index], weights, index + 1);
}
}
bool isMeasurable(int amount, const Vector<int>& weights) {
return isMeasurableRec(amount, weights, 0);
}
-想象一下,我们首先将要测量的数量(称为 n )放在天平的左侧。 这使得规模上的不平衡等于 n 。 想象一下,有某种方法可以测量 n 。 如果我们一次将一个重量放在秤上,我们可以查看第一个重量的放置位置(假设它的重量为 w )。 它必须:
-
-- 向左走,使规模上的净不平衡 n + w ,或
-- 向右走,使规模上的净不平衡 n – w ,或
-- 根本不习惯,留下净不平衡 n 。
-
-如果确实有可能测量 n ,那么这三个选项之一必须是实现它的方法,即使我们不知道它是哪一个。 然后我们要问的问题是,是否有可能使用剩余的权重来衡量新的净失衡——我们可以递归地确定! 另一方面,如果无法测量 n ,那么无论我们选择哪个选项,我们都会发现没有办法使用剩余的权重来使一切平衡!
-如果我们递归地进行,我们在这里,我们需要考虑我们的基本情况。 我们可以选择的选项有很多。 一个简单的方法如下:假设我们根本没有任何重量,我们被要求查看是否可以不使用重量来测量某些重量。 在什么情况下我们可以这样做? 好吧,如果我们称重的东西有一个非零重量,我们就不可能测量它——把它放在秤上会使它倾斜到某一边,但这并不能告诉我们它有多少重量。 另一方面,如果我们称量的东西是完全失重的,那么把它放在秤上也不会导致它倾斜,让我们相信它确实是失重的! 因此,作为我们的基本情况,我们会说当我们减少到没有剩余权重时, ,我们可以精确测量n 如果 n = 0 。 考虑到这一点,这是我们的代码:
-递归解决找零问题
-不使用记忆的情况
-`从第一个硬币开始遍历,并穷举它的所有枚数,将其作为下一枚硬币的参数传递
-int fewestCoinsFor(int cents, const Set<int>& coins) {
/* Can't have a negative number of cents. */
if (cents < 0) {
error("You owe me money, not the other way around!");
}
/* Base case: You need no coins to give change for no cents. */
else if (cents == 0) {
return 0;
}
/* Base case: No coins exist. Then it's not possible to make the
* amount. In that case, give back a really large value as a
* sentinel.
*/
else if (coins.isEmpty()) {
return cents + 1;
}
/* Recursive case: Pick a coin, then try using each distinct number of
* copies of it that we can.
*/
else {
/* The best we've found so far. We initialize this to a large value so
* that it's replaced on the first iteration of the loop. Do you see
* why cents + 1 is a good choice?
*/
int bestSoFar = cents + 1;
/* Pick a coin. */
int coin = coins.first();
/* Try all amounts of it. */
for (int copies = 0; copies * coin <= cents; copies++) {
/* See what happens if we make this choice. Once we use this
* coin, we won't use the same coin again in the future.
*/
int thisChoice = copies + fewestCoinsFor(cents - copies * coin,
coins - coin);
/* Is this better than what we have so far? */
if (thisChoice < bestSoFar) {
bestSoFar = thisChoice;
}
}
/* Return whatever worked best. */
return bestSoFar;
}
}
-使用记忆进行优化
-/* How few coins are needed to make the total, given that we can only use
* coins from index startIndex and onward?
*/
int fewestCoinsRec(int cents, const Vector<int>& coins, int startIndex,Grid<int>& memo) {
/* Base case: You need no coins to give change for no cents. */
if (cents == 0) {
return 0;
}
/* Base case: No coins exist. Then it's not possible to make the
* amount. In that case, give back a really large value as a
* sentinel.
*/
else if (startIndex == coins.size()) {
return cents + 1;
}
/* Base case: We already know the answer. */
else if (memo[cents][startIndex] != -1) {
return memo[cents][startIndex];
}
/* Recursive case: Pick a coin, then try using each distinct number of
* copies of it that we can.
*/
else {
/* The best we've found so far. We initialize this to a large value so
* that it's replaced on the first iteration of the loop. Do you see
* why cents + 1 is a good choice?
*/
int bestSoFar = cents + 1;
/* Pick a coin. */
int coin = coins[startIndex];
/* Try all amounts of it. */
for (int copies = 0; copies * coin <= cents; copies++) {
/* See what happens if we make this choice. Once we use this
* coin, we won't use the same coin again in the future.
*/
int thisChoice = copies + fewestCoinsRec(cents - copies * coin,
coins, startIndex + 1,
memo);
/* Is this better than what we have so far? */
if (thisChoice < bestSoFar) {
bestSoFar = thisChoice;
}
}
/* Return whatever worked best. */
memo[cents][startIndex] = bestSoFar;
return bestSoFar;
}
}
int fewestCoinsFor(int cents, const Set<int>& coins) {
/* Can't have a negative number of cents. */
if (cents < 0) {
error("You owe me money, not the other way around!");
}
/* Convert from a Set<int> to a Vector<int> so we have a nice ordering
* on things.
*/
Vector<int> coinVec;
for (int coin: coins) {
coinVec += coin;
}
/* Build our memoization table. Since the number of cents left ranges from
* 0 to cents, we need cents+1 rows. Since the start index of the coin
* ranges from 0 to coins.size(), we make coins.size() + 1 columns.
*
* -1 is used as a sentinel to indicate "nothing has been computed here
* yet."
*/
Grid<int> memo(cents + 1, coins.size() + 1, -1);
/* Now ask how many coins are needed to make the total, using any coins
* from index 0 onward.
*/
return fewestCoinsRec(cents, coinVec, 0, memo);
}
-递归穷举付账单
-递归机制:对第一个人来说,0-total所有金额都会付一遍,随后传递给下一个人,当只有一人时,付清所有余额并打印账单 传递参数:string,int的映射存储目前为止的账单,string集合存储所有付账者
-void listPossiblePaymentsRec(int total, const Set<string>& people,const Map<string, int>& payments) {
/* Base case: if there's one person left, they have to pay the whole bill. */
if (people.size() == 1) {
Map<string, int> finalPayments = payments;
finalPayments[people.first()] = total;
cout << finalPayments << endl;
}
/* Recursive case: The first person has to pay some amount between 0 and the
* total amount. Try all of those possibilities.
*/
else {
for (int payment = 0; payment <= total; payment++) {
/* Create a new assignment of people to payments in which this first
* person pays this amount.
*/
Map<string, int> updatedPayments = payments;
updatedPayments[people.first()] = payment;
listPossiblePaymentsRec(total - payment, people - people.first(),updatedPayments);
}
}
}
void listPossiblePayments(int total, const Set<string>& people) {
/* Edge cases: we can't pay a negative total, and there must be at least one
* person.
*/
if (total < 0) error("Guess you're an employee?");
if (people.isEmpty()) error("Dine and dash?");
listPossiblePaymentsRec(total, people, {});
}
-递归寻找完全平方数列
-主要参数为sofar——用于存储目前的序列和一个set用于存储还没放入数列的数字,`确保这两者同时被传递,且其并集为所有数字
-Optional<Vector<int>> findSquareSequence(int n) {
/*Validate input.*/
if (n < 0) {
error("Don't be so negative!");
}
/* Build a set of the numbers 1, 2, 3, ..., n. */
Set<int> options;
for (int i = 1; i <= n; i++) {
options += i;
}
return findSequenceRec(options, { });
}
Optional<Vector<int>> findSequenceRec(const Set<int>& unused,
const Vector<int>& soFar) {
/*Base Case: If all numbers are used, we have our sequence!*/
if (unused.isEmpty()) {
return soFar;
}
/* Recursive Case: Some number comes next. Try each of them and see which
* one we should pick.
*/
for (int next: unused) {
/* We can use this if either
*
* 1. the sequence is empty, so we're first in line, or
* 2. the sequence is not empty, but we sum to a perfect square
* with the previous term.
*/
if (soFar.isEmpty() ||
isPerfectSquare(next + soFar[soFar.size() - 1])) {
/* See what happens if we extend with this number. */
auto result = findSequenceRec(unused - next, soFar + next);
if (result != Nothing) {
return result;
}
}
}
/* Tried all options and none of them worked. Oh well! */
return Nothing;
}
-汉诺塔递归
-假设有三座汉诺塔,start ,temp ,finish
对n层的汉诺塔问题,先考虑n-1层的,随后考虑n-2层,到最后只需要考虑两层问题,两层的汉诺塔非常容易解决,起点为start,终点是temp,临时塔为finish,最后我们得到temp上的两层汉诺塔 这时将start的3移动到finish塔,这时只要将两层汉诺塔转移到finish则完成了三层汉诺塔,这个过程中的起点为temp,终点是finish,临时塔是start 以此类推,四层塔基于三层塔,n
层塔基于n-1
塔,汉诺塔问题解决
-int moveTower(int numDisks, char start, char finish, char temp) {
if (numDisks == 0) {
return 0;
} else {
int movesOne = moveTower(numDisks - 1, start, temp, finish);
moveSingleDisk(start, finish);
int movesTwo = moveTower(numDisks - 1, temp, finish, start);
return 1 + movesOne + movesTwo;
}
}
-]]>
-
- 课程笔记
- 数据结构与算法
-
-
- 课程笔记
- 数据结构与算法
- 斯坦福
- c++
-
-
-
- 基于斯坦福cs106l的c++编程规范笔记
- /thinklive/48468/
- c++特性
-
-- 更好的C C++支持
命令式编程
,一种编程风格,其中程序按顺序执行的命令序列。从这个意义上讲,C++ 可以看作是对C 编程语言,使日常命令式编程更加直观和更容易使用。课程阅读器的这一部分介绍了一些 C++ 最常用的库,包括标准模板库,并展示了如何使用这些库来构建命令程式。 此外,它探索了最初出现在 C++ 语言中的新原语。C 编程语言,即指针、C 字符串和预处理器。
-- 数据抽象
-
-C++与其兄弟C的最大区别在于_数据抽象_,程序执行的方式可以与程序执行的方式分开 程序员谈论那个程序。
-
-- 面向对象编程
-
-. 面向对象编程是一种完全不同的方式考虑程序设计,可以极大地简化复杂的软件系统。 钥匙 面向对象背后的概念很简单,但要真正体会到面向对象的力量 编程,您将需要一次又一次地看到它的运行情况。 这部分课程 读者探索了面向对象编程中的主要概念以及如何在 C++ 中实现它继承和多态。
-
-- 泛型编程
-
-泛型编程是一种编程风格,旨在构建可以解决一系列远远超出最初设想的问题的软件
-履行。 虽然泛型编程的完整处理远远超出了介绍性的范围C++ 编程课,泛型编程的许多思想都可以访问并且可以从根本上改变了您对 C++ 编程的看法。
-const
-Can’t declare non-const reference to const variable Can’t declare non-const reference to const vari
-
-模板
- 函数指针:将函数作为对象传递
-stl
-sequence:线性,有顺序 associative:不一定线性,有索引机制(map)
-vector:有顺序的相同类型的数据集合,大小可控制 ---子属性:size:元素数量 ---capacity:单个元素大小 vector最常用,deque用于首部插入场合,list用于多种列表
-associative(关联数组):有顺序的需要有比较方法,无序的需要哈希函数(更快) iterators(迭代器):用于访问容器中的所有数据 --常用函数,begin(),end(),iter++,*(pointer),== !=,=(赋值,复制),
-输入输出流
-First call to std::cin >> creates a command line
-prompt that allows the user to type until they hit enter
-
-- Each >> ONLY reads until the next whitespace
-
-- Whitespace = tab, space, newline
-
-- Everything after the first whitespace gets saved and
-used the next time std::cin >> is called
-
-- The place its saved is called a buffer
-
-hashmap的c++实现
-相关函数
-构造函数HashMap():
接受参数count(值的个数),hash function(有默认值)
参数(typename fitst,typename last,bucket_count,H)
//用一个容器首尾指针初始化hashmap
eg.
hashmap<k,m> map{vec.begin(),vec.end()}
参数(init_list init,bucket_count,H)
//用容器直接初始化hashmap
eg.
HashMap<char, int> map{{'a', 3}, {'b', 5}, {'c', 7}};
public:
key-键
mapped-被加密的值(int)
H-哈希函数
bucket_count(存储的键值对数组容量)
load_factor(内联函数,返回size/bucket_count,即实际储存值的键值对)
contains(参数const K& key判断是否存在改键,返回bool值)
at(参数k,返回mapped的引用)
clear(清空键值对)
insert(参数为键值对引用,返回一对pair<iterator,bool>,iter指向改键值对,无论是否已存在,bool表示是否成功添加,如为false则已存在该键值对)
erase(key为参数,返回bool值)
earse(iter为参数,返回该指针下一个位置)
rehash(size_t为参数,重新哈希为给出的新的指针数组大小)
begin(根据hashmap是否为const给出iter或const iter)
end(返回伪指针)
debug(打印所有哈希键值对以及哈希表所有参数,注意,必须基于重载<<运算符的基础)
符号重载:
M& [](const key& ,返回insert(key)的返回pair的first成员的second成员,即mapped值)
//用于给key对应的value(mapped)赋值
private:
node(struct,包含next指针和value)
nodepair(前后node的pair)
findnode(参数key,返回指针对<prev,curr>)
first_not_empty_bucket()
make_iterator(参数node*curr)
_bucket_array(vector<node*>,其中一个node*为ptr,则ptr->value为<key ,mapped>)
//指针构造
_bucket_array:由指针组成的数组,每个成员都是一个指针
储存的值为next指针和一个pair<key,mapped>
operator-> is a bit of an odd-ball. When you write p->m, it is interpreted as (p.operator->())->m.
- This means operator-> should return a pointer to the object that has the field m.
-涉及的c++特性
-匿名函数 基本lambda语法 基本形式如下: 【capture】(parameters)->return-type {body}
-typename function() return {x,y,z} 即用{}的参数初始化原函数返回的类型
-ptrdiff_t:用于储存两个指针的差
-conditional_t<func,x,y>如果func为true则x,为false则y
-forward_iterator_tag:单方向迭代器(可读写) ++iter,iter+=1随后返回对自身的引用 iter++,先返回一个对自身的复制,随后iter+=1
-std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
-ate:从文件尾部开始 strsub(start,length) 移动语义(c++11新特性) clss(classname &&) 利用右值引用的部分数据直接初始化新的类,并在初始化之后将右值删除,可以通过std::move()强制转化左值为右值。
-]]>
-
- 课程笔记
- 数据结构与算法
-
-
- 课程笔记
- 斯坦福
- c++
-
-
基于c++ primer plus的读书笔记
/thinklive/15197/
@@ -12021,8 +11878,162 @@ used the next time std::cin >> is called
其他
- c++
读书笔记
+ c++
+
+
+
+ 基于斯坦福cs106l的c++编程规范笔记
+ /thinklive/48468/
+ c++特性
+
+- 更好的C C++支持
命令式编程
,一种编程风格,其中程序按顺序执行的命令序列。从这个意义上讲,C++ 可以看作是对C 编程语言,使日常命令式编程更加直观和更容易使用。课程阅读器的这一部分介绍了一些 C++ 最常用的库,包括标准模板库,并展示了如何使用这些库来构建命令程式。 此外,它探索了最初出现在 C++ 语言中的新原语。C 编程语言,即指针、C 字符串和预处理器。
+- 数据抽象
+
+C++与其兄弟C的最大区别在于_数据抽象_,程序执行的方式可以与程序执行的方式分开 程序员谈论那个程序。
+
+- 面向对象编程
+
+. 面向对象编程是一种完全不同的方式考虑程序设计,可以极大地简化复杂的软件系统。 钥匙 面向对象背后的概念很简单,但要真正体会到面向对象的力量 编程,您将需要一次又一次地看到它的运行情况。 这部分课程 读者探索了面向对象编程中的主要概念以及如何在 C++ 中实现它继承和多态。
+
+- 泛型编程
+
+泛型编程是一种编程风格,旨在构建可以解决一系列远远超出最初设想的问题的软件
+履行。 虽然泛型编程的完整处理远远超出了介绍性的范围C++ 编程课,泛型编程的许多思想都可以访问并且可以从根本上改变了您对 C++ 编程的看法。
+const
+Can’t declare non-const reference to const variable Can’t declare non-const reference to const vari
+
+模板
+ 函数指针:将函数作为对象传递
+stl
+sequence:线性,有顺序 associative:不一定线性,有索引机制(map)
+vector:有顺序的相同类型的数据集合,大小可控制 ---子属性:size:元素数量 ---capacity:单个元素大小 vector最常用,deque用于首部插入场合,list用于多种列表
+associative(关联数组):有顺序的需要有比较方法,无序的需要哈希函数(更快) iterators(迭代器):用于访问容器中的所有数据 --常用函数,begin(),end(),iter++,*(pointer),== !=,=(赋值,复制),
+输入输出流
+First call to std::cin >> creates a command line
+prompt that allows the user to type until they hit enter
+
+- Each >> ONLY reads until the next whitespace
+
+- Whitespace = tab, space, newline
+
+- Everything after the first whitespace gets saved and
+used the next time std::cin >> is called
+
+- The place its saved is called a buffer
+
+hashmap的c++实现
+相关函数
+构造函数HashMap():
接受参数count(值的个数),hash function(有默认值)
参数(typename fitst,typename last,bucket_count,H)
//用一个容器首尾指针初始化hashmap
eg.
hashmap<k,m> map{vec.begin(),vec.end()}
参数(init_list init,bucket_count,H)
//用容器直接初始化hashmap
eg.
HashMap<char, int> map{{'a', 3}, {'b', 5}, {'c', 7}};
public:
key-键
mapped-被加密的值(int)
H-哈希函数
bucket_count(存储的键值对数组容量)
load_factor(内联函数,返回size/bucket_count,即实际储存值的键值对)
contains(参数const K& key判断是否存在改键,返回bool值)
at(参数k,返回mapped的引用)
clear(清空键值对)
insert(参数为键值对引用,返回一对pair<iterator,bool>,iter指向改键值对,无论是否已存在,bool表示是否成功添加,如为false则已存在该键值对)
erase(key为参数,返回bool值)
earse(iter为参数,返回该指针下一个位置)
rehash(size_t为参数,重新哈希为给出的新的指针数组大小)
begin(根据hashmap是否为const给出iter或const iter)
end(返回伪指针)
debug(打印所有哈希键值对以及哈希表所有参数,注意,必须基于重载<<运算符的基础)
符号重载:
M& [](const key& ,返回insert(key)的返回pair的first成员的second成员,即mapped值)
//用于给key对应的value(mapped)赋值
private:
node(struct,包含next指针和value)
nodepair(前后node的pair)
findnode(参数key,返回指针对<prev,curr>)
first_not_empty_bucket()
make_iterator(参数node*curr)
_bucket_array(vector<node*>,其中一个node*为ptr,则ptr->value为<key ,mapped>)
//指针构造
_bucket_array:由指针组成的数组,每个成员都是一个指针
储存的值为next指针和一个pair<key,mapped>
operator-> is a bit of an odd-ball. When you write p->m, it is interpreted as (p.operator->())->m.
- This means operator-> should return a pointer to the object that has the field m.
+涉及的c++特性
+匿名函数 基本lambda语法 基本形式如下: 【capture】(parameters)->return-type {body}
+typename function() return {x,y,z} 即用{}的参数初始化原函数返回的类型
+ptrdiff_t:用于储存两个指针的差
+conditional_t<func,x,y>如果func为true则x,为false则y
+forward_iterator_tag:单方向迭代器(可读写) ++iter,iter+=1随后返回对自身的引用 iter++,先返回一个对自身的复制,随后iter+=1
+std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
+ate:从文件尾部开始 strsub(start,length) 移动语义(c++11新特性) clss(classname &&) 利用右值引用的部分数据直接初始化新的类,并在初始化之后将右值删除,可以通过std::move()强制转化左值为右值。
+]]>
+
+ 课程笔记
+ 数据结构与算法
+
+
+ 课程笔记
+ c++
+ 斯坦福
+
+
+
+ 基于斯坦福cs106b的c++数据结构笔记
+ /thinklive/16615/
+ 一些查找和排序算法
+二分查找法 最坏情况:log2n 寻找最小排序 向前插入算法
+合并算法接受两个排序的 列出并将它们组合成一个 排序列表。 ● 虽然两个列表都是非空的,但比较它们的 第一要素。 删除较小的元素 并将其附加到输出。 ● 一旦一个列表为空,添加所有元素 另一个列表输出。 ● 它运行时间为 O(n),其中 n 是总数 合并的元素数量。 无限递归后的合并算法 复杂度:nlog2n
+容器类
+set(集合):无序不允许重复的容器类,可以添加删除元素 You can add a value to a Set by writing set += value; s. ● You can remove a value from a Set by writing set -= value; ● You can check if a value exists in a Set by writing set.contains(value)
map(键值对的集合) 如果没有对应key的value,返回默认值(见定义文件) `vector vector的remove根据移除元素的索引有1-n的复杂度,移除尾部为O(1),如果不在意索引,可以交换要移除元素和尾部元素再移除
+哈希表
+哈希表的负载因子α表示元素和表格键数量的比,决定了查找速度
+检查表中是否存在元素
+● 计算元素的散列码。 ● 跳转到表格中的那个位置。 ● 向前扫描——必要时环绕——直到项目或一个 发现空插槽。
+将元素插入表中
+● 如果项目已经存在,什么也不做。 ● 否则,跳转到元素哈希码给定的槽。 向前走——必要时环绕——直到一个空白点或 找到墓碑插槽。 然后,将项目放在那里。
+从表中删除一个元素
+● 跳转到由元素的散列码给定的槽。 ● 向前走——必要时环绕——直到物品或 发现空插槽。 如果找到该项目,请将其替换为 墓碑。
+“罗宾汉哈希表”
+
+- 如果插入的值比其将插入的位置的值距离索引更远,则替换插入值和当前值
+- 删除值时,将后其离原键远的元素前移
+- ★ 罗宾汉哈希一览 ★
+- 检查表中是否存在元素:
+- ● 跳转到表中由元素的散列码给出的位置。
+- ● 向前扫描——如有必要环绕——记录有多少步 你拿走了。 当您找到该项目、找到一个空白槽或找到一个 离家更近的空位比你走的步数还多。
+- 将元素插入表中:
+- ● 如果该元素已在表中,则什么也不做。
+- ● 跳转到由元素的散列码给出的表槽。 向前扫描 - 换行 如有必要,四处走走——记录所走的步数。 如果你找到一个 空插槽,将元素放在那里。 否则,如果当前插槽已满并且 比您插入的元素更靠近家,将要插入的项目放在那里, 替换那个位置的元素,然后继续插入,就好像你 正在插入被置换的元素。
+- 从表中删除一个元素:
+- ● 跳转到由元素的散列码给定的槽。
+- ● 向前走——如有必要,环绕——直到物品或空槽被放置 成立。 如果找到该项目,请将其删除。 然后,继续前进——包裹 around as necessary – 将表中的元素向后移动一个槽位,直到 找到空插槽或位于其原始位置的项目
+
+string类
+str::npos表示容器的最后一个成员位置 if (s.find("e") != string::npos) //find函数找不到时返回npos if s in str: string obj; obj.substr(int pos) //pos为要包含的第一个字符串的位置 std::string a = "0123456789abcdefghij";
+
// count is npos, returns [pos, size())
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub1 = a.substr(10);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub1 << '\n';
// both pos and pos+count are within bounds, returns [pos, pos+count)
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub2 = a.substr(5, 3);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub2 << '\n';
// pos is within bounds, pos+count is not, returns [pos, size())
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub4 = a.substr(a.size()-3, 50);
// this is effectively equivalent to
// std::string sub4 = a.substr(17, 3);
// since a.size() == 20, pos == a.size()-3 == 17, and a.size()-pos == 3
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub4 << '\n';
try {
// pos is out of bounds, throws
[std::string](http://en.cppreference.com/w/cpp/string/basic_string) sub5 = a.substr(a.size()+3, 50);
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << sub5 << '\n';
} catch(const [std::out_of_range](http://en.cppreference.com/w/cpp/error/out_of_range)& e) {
[std::cout](http://en.cppreference.com/w/cpp/io/cout) << "pos exceeds string size\n";
}
}
输出:
abcdefghij
567
hij
pos exceeds string size
+`replace和insert str1.insert(start, str2) str1.replace(start, length, str2)
+一些实现
+优先队列
+# include "HeapPQueue.h"
using namespace std;
HeapPQueue::HeapPQueue() {
elems = new DataPoint[INITIAL_SIZE] {};
for (int i=0;i<INITIAL_SIZE;i++)
{
elems[i].weight=0;
}
allocatedSize=INITIAL_SIZE;
}
HeapPQueue::~HeapPQueue() {
delete [] elems;
}
int HeapPQueue::size() const {
return logicalSize;
}
bool HeapPQueue::isEmpty() const {
return logicalSize==0;
}
void HeapPQueue::enqueue(const DataPoint& data) {
if (logicalSize+1<allocatedSize)
{
if (logicalSize==0)
{
elems[1]=data;
logicalSize++;
}
else
{
logicalSize++;
int i=1;
while (data.weight>elems[i].weight && i<=logicalSize && elems[i].weight!=0)
{
i++;
}
if (i<logicalSize)
{
DataPoint temp=elems[i];
elems[i]=data;
for(i;i<logicalSize;i++)
{
DataPoint temp_plus=elems[i+1];
elems[i+1]=temp;
temp=temp_plus;
}
}
else
{
elems[i]=data;
}
}
}
}
DataPoint HeapPQueue::peek() const {
return elems[logicalSize];
}
DataPoint HeapPQueue::dequeue() {
DataPoint to_return=elems[1];
if(!isEmpty())
{
for (int i=1;i<logicalSize;i++)
{
elems[i]=elems[i+1];
}
elems[logicalSize]={};
logicalSize--;
}
return to_return;
}
+计数排序
+首先算出最大值,然后用一个数组的索引存储待排序数组的成员,其索引对应值存储出现次数,然后用两个同步的for循环和递增的next参数表示排序中的索引值来进行排序(也就是重新赋值)
+/* Given a Vector<int>, returns the largest number in that Vector. */
int maxOf(const Vector<int>& values) {
/* Bounds-check inputs. */
if (values.isEmpty()) {
error("Can't find the maximum of no values.");
}
int result = values[0];
for (int i = 1; i < values.size(); i++) {
result = max(result, values[i]);
}
return result;
}
/* Given a list of numbers, creates a histogram from those numbers. */
Vector<int> histogramFor(const Vector<int>& values) {
/* Create a histogram with the right number of slots. Initially, all values
* in the histogram will be zero.
*/
Vector<int> histogram(maxOf(values) + 1);
/* Scan across the input vector, incrementing the histogram values. */
for (int value: values) {
histogram[value]++;
}
return histogram;
}
void countingSort(Vector<int>& values) {
/* Edge Case: If the array is empty, then it's already sorted. This is
* needed because we can't take the maximum value of an empty vector.
*/
if (values.isEmpty()) {
return;
}
/* Form the histogram. */
auto histogram = histogramFor(values);
/* Scan across the histogram writing out the appropriate number of copies
* of each value. We track the index of the next free spot to write to,
* as it varies based on how many items we've written out so far.
*/
int next = 0;
for (int value = 0; value < histogram.size(); value++) {
/* Write out the right number of copies. */
for (int copy = 0; copy < histogram[value]; copy++) {
values[next] = value;
next++;
}
}
}
+错题集
+递归的效率优化
+每次递归都会创造所有变量的临时复制 基于递归的这种性质,它会需要巨大的时间和空间来完成任务,并且会造成算力上的浪费。 通过记忆表机制能部分解决这个问题,方法是每次递归的返回值都会按索引存入一个表格,并且每次递归前查询表格中是否有结果,这样可以让每个临时副本的运算结果能被所有函数共享。
+递归计算给定元素的不同结构哈夫曼树的数量
+对每个给定元素集来说,首先要做到是确定根节点元素是第几个大的元素,确定之后,左子树和右子树的元素数也随之确定,在此之后分别对左节点和右节点作为根节点做同样的递归
+
int numBSTsOfSize(int n) {
/* Base case: There’s only one tree of size 0, namely, the empty BST. */
if (n == 0) return 1;
/* Recursive case: Imagine all possible ways to choose a root and build the
* left and right subtrees.
*/
int result = 0;
/* Put the the nodes at indices 0, 1, 2, ..., n-1 up at the root. */
for (int i = 0; i < n; i++) {
/* Each combination of a BST of i elements and a BST of n - 1 - i elements
* can be used to build one BST of n elements. The number of pairs of
* trees we can make this way is given by the product of the number of
* trees of each type.
*/
result += numBSTsOfSize(i) * numBSTsOfSize(n - 1 - i);
}
return result;
}
+递归解决吃巧克力问题
+求出吃法数量
+if (numSquares<0)
{
error("输入数据不能为负数");
}
else if (numSquares<=1)
{
return 1;
}
else
{
return numWaysToEat(numSquares-1)+numWaysToEat(numSquares-2);
}
+打印每种吃法
+`需要一个辅助向量储存历史记录
+/* Print all ways to eat numSquares more squares, given that we've
* already taken the bites given in soFar.
*/
void printWaysToEatRec(int numSquares, const Vector<int>& soFar) {
/* Base Case: If there are no squares left, the only option is to use
* the bites we've taken already in soFar.
*/
if (numSquares == 0) {
cout << soFar << endl;
}
/* Base Case: If there is one square lfet, the only option is to eat
* that square.
*/
else if (numSquares == 1) {
cout << soFar + 1 << endl;
}
/* Otherwise, we take take bites of size one or of size two. */
else {
printWaysToEatRec(numSquares - 1, soFar + 1);
printWaysToEatRec(numSquares - 2, soFar + 2);
}
}
void printWaysToEat(int numSquares) {
if (numSquares < 0) {
error("You owe me some chocolate!");
}
/* We begin without having made any bites. */
printWaysToEatRec(numSquares, {});
}
+递归解决翻煎饼问题
+bool isSorted(Stack<double> pancakes) {
double last = -1; // No pancakes have negative size;
while (!pancakes.isEmpty()) {
/* Check the next pancake. */
double next = pancakes.pop();
if (next < last) {
return false;
}
last = next;
}
/* Pancakes are in increasing order! */
return true;
}
/* Given a stack of pancakes and a flip size, flips that many pancakes
* on the top of the stack.
*/
Stack<double> flip(Stack<double> pancakes, int numToFlip) {
/* Take the top pancakes off the stack and run them into a queue.
* This preserves the order in which they were removed.
*/
Queue<double> buffer;
for (int i = 0; i < numToFlip; i++) {
buffer.enqueue(pancakes.pop());
}
/* Move the pancakes back. */
while (!buffer.isEmpty()) {
pancakes.push(buffer.dequeue());
}
return pancakes;
}
Optional<Vector<int>> sortStack(Stack<double> pancakes, int numFlips) {
/* Base Case: If the stack is sorted, great! We're done, and no flips
* were needed.
*/
if (isSorted(pancakes)) {
return { }; // No flips
}
/* Base Case: If the stack isn't sorted and we're out of flips, then
* there is no way to sort things.
*/
else if (numFlips == 0) {
return Nothing;
}
/* Recursive Case: The stack isn't sorted and we still have flips left.
* The next flip could flip 1, 2, 3, ..., or all N of the pancakes.
* Try each option and see whether any of them work.
*/
for (int numToFlip = 1; numToFlip <= pancakes.size(); numToFlip++) {
/* Make the flip and see if it works. */
auto result = sortStack(flip(pancakes, numToFlip), numFlips - 1);
if (result != Nothing) {
/* The result holds all the remaining flips but doesn't know about
* the flip we just did. Insert that flip at the beginning.
*/
result.value().insert(0, numToFlip);
return result;
}
}
/* If we're here, then no matter which flip we make first, we cannot
* get the pancakes sorted. Give up.
*/
return Nothing;
}
+递归解决天平问题
+bool isMeasurableRec(int amount, const Vector<int>& weights, int index) {
if (index == weights.size()) {
return amount == 0;
} else {
return isMeasurableRec(amount, weights, index + 1) ||
isMeasurableRec(amount + weights[index], weights, index + 1) ||
isMeasurableRec(amount - weights[index], weights, index + 1);
}
}
bool isMeasurable(int amount, const Vector<int>& weights) {
return isMeasurableRec(amount, weights, 0);
}
+想象一下,我们首先将要测量的数量(称为 n )放在天平的左侧。 这使得规模上的不平衡等于 n 。 想象一下,有某种方法可以测量 n 。 如果我们一次将一个重量放在秤上,我们可以查看第一个重量的放置位置(假设它的重量为 w )。 它必须:
+
+- 向左走,使规模上的净不平衡 n + w ,或
+- 向右走,使规模上的净不平衡 n – w ,或
+- 根本不习惯,留下净不平衡 n 。
+
+如果确实有可能测量 n ,那么这三个选项之一必须是实现它的方法,即使我们不知道它是哪一个。 然后我们要问的问题是,是否有可能使用剩余的权重来衡量新的净失衡——我们可以递归地确定! 另一方面,如果无法测量 n ,那么无论我们选择哪个选项,我们都会发现没有办法使用剩余的权重来使一切平衡!
+如果我们递归地进行,我们在这里,我们需要考虑我们的基本情况。 我们可以选择的选项有很多。 一个简单的方法如下:假设我们根本没有任何重量,我们被要求查看是否可以不使用重量来测量某些重量。 在什么情况下我们可以这样做? 好吧,如果我们称重的东西有一个非零重量,我们就不可能测量它——把它放在秤上会使它倾斜到某一边,但这并不能告诉我们它有多少重量。 另一方面,如果我们称量的东西是完全失重的,那么把它放在秤上也不会导致它倾斜,让我们相信它确实是失重的! 因此,作为我们的基本情况,我们会说当我们减少到没有剩余权重时, ,我们可以精确测量n 如果 n = 0 。 考虑到这一点,这是我们的代码:
+递归解决找零问题
+不使用记忆的情况
+`从第一个硬币开始遍历,并穷举它的所有枚数,将其作为下一枚硬币的参数传递
+int fewestCoinsFor(int cents, const Set<int>& coins) {
/* Can't have a negative number of cents. */
if (cents < 0) {
error("You owe me money, not the other way around!");
}
/* Base case: You need no coins to give change for no cents. */
else if (cents == 0) {
return 0;
}
/* Base case: No coins exist. Then it's not possible to make the
* amount. In that case, give back a really large value as a
* sentinel.
*/
else if (coins.isEmpty()) {
return cents + 1;
}
/* Recursive case: Pick a coin, then try using each distinct number of
* copies of it that we can.
*/
else {
/* The best we've found so far. We initialize this to a large value so
* that it's replaced on the first iteration of the loop. Do you see
* why cents + 1 is a good choice?
*/
int bestSoFar = cents + 1;
/* Pick a coin. */
int coin = coins.first();
/* Try all amounts of it. */
for (int copies = 0; copies * coin <= cents; copies++) {
/* See what happens if we make this choice. Once we use this
* coin, we won't use the same coin again in the future.
*/
int thisChoice = copies + fewestCoinsFor(cents - copies * coin,
coins - coin);
/* Is this better than what we have so far? */
if (thisChoice < bestSoFar) {
bestSoFar = thisChoice;
}
}
/* Return whatever worked best. */
return bestSoFar;
}
}
+使用记忆进行优化
+/* How few coins are needed to make the total, given that we can only use
* coins from index startIndex and onward?
*/
int fewestCoinsRec(int cents, const Vector<int>& coins, int startIndex,Grid<int>& memo) {
/* Base case: You need no coins to give change for no cents. */
if (cents == 0) {
return 0;
}
/* Base case: No coins exist. Then it's not possible to make the
* amount. In that case, give back a really large value as a
* sentinel.
*/
else if (startIndex == coins.size()) {
return cents + 1;
}
/* Base case: We already know the answer. */
else if (memo[cents][startIndex] != -1) {
return memo[cents][startIndex];
}
/* Recursive case: Pick a coin, then try using each distinct number of
* copies of it that we can.
*/
else {
/* The best we've found so far. We initialize this to a large value so
* that it's replaced on the first iteration of the loop. Do you see
* why cents + 1 is a good choice?
*/
int bestSoFar = cents + 1;
/* Pick a coin. */
int coin = coins[startIndex];
/* Try all amounts of it. */
for (int copies = 0; copies * coin <= cents; copies++) {
/* See what happens if we make this choice. Once we use this
* coin, we won't use the same coin again in the future.
*/
int thisChoice = copies + fewestCoinsRec(cents - copies * coin,
coins, startIndex + 1,
memo);
/* Is this better than what we have so far? */
if (thisChoice < bestSoFar) {
bestSoFar = thisChoice;
}
}
/* Return whatever worked best. */
memo[cents][startIndex] = bestSoFar;
return bestSoFar;
}
}
int fewestCoinsFor(int cents, const Set<int>& coins) {
/* Can't have a negative number of cents. */
if (cents < 0) {
error("You owe me money, not the other way around!");
}
/* Convert from a Set<int> to a Vector<int> so we have a nice ordering
* on things.
*/
Vector<int> coinVec;
for (int coin: coins) {
coinVec += coin;
}
/* Build our memoization table. Since the number of cents left ranges from
* 0 to cents, we need cents+1 rows. Since the start index of the coin
* ranges from 0 to coins.size(), we make coins.size() + 1 columns.
*
* -1 is used as a sentinel to indicate "nothing has been computed here
* yet."
*/
Grid<int> memo(cents + 1, coins.size() + 1, -1);
/* Now ask how many coins are needed to make the total, using any coins
* from index 0 onward.
*/
return fewestCoinsRec(cents, coinVec, 0, memo);
}
+递归穷举付账单
+递归机制:对第一个人来说,0-total所有金额都会付一遍,随后传递给下一个人,当只有一人时,付清所有余额并打印账单 传递参数:string,int的映射存储目前为止的账单,string集合存储所有付账者
+void listPossiblePaymentsRec(int total, const Set<string>& people,const Map<string, int>& payments) {
/* Base case: if there's one person left, they have to pay the whole bill. */
if (people.size() == 1) {
Map<string, int> finalPayments = payments;
finalPayments[people.first()] = total;
cout << finalPayments << endl;
}
/* Recursive case: The first person has to pay some amount between 0 and the
* total amount. Try all of those possibilities.
*/
else {
for (int payment = 0; payment <= total; payment++) {
/* Create a new assignment of people to payments in which this first
* person pays this amount.
*/
Map<string, int> updatedPayments = payments;
updatedPayments[people.first()] = payment;
listPossiblePaymentsRec(total - payment, people - people.first(),updatedPayments);
}
}
}
void listPossiblePayments(int total, const Set<string>& people) {
/* Edge cases: we can't pay a negative total, and there must be at least one
* person.
*/
if (total < 0) error("Guess you're an employee?");
if (people.isEmpty()) error("Dine and dash?");
listPossiblePaymentsRec(total, people, {});
}
+递归寻找完全平方数列
+主要参数为sofar——用于存储目前的序列和一个set用于存储还没放入数列的数字,`确保这两者同时被传递,且其并集为所有数字
+Optional<Vector<int>> findSquareSequence(int n) {
/*Validate input.*/
if (n < 0) {
error("Don't be so negative!");
}
/* Build a set of the numbers 1, 2, 3, ..., n. */
Set<int> options;
for (int i = 1; i <= n; i++) {
options += i;
}
return findSequenceRec(options, { });
}
Optional<Vector<int>> findSequenceRec(const Set<int>& unused,
const Vector<int>& soFar) {
/*Base Case: If all numbers are used, we have our sequence!*/
if (unused.isEmpty()) {
return soFar;
}
/* Recursive Case: Some number comes next. Try each of them and see which
* one we should pick.
*/
for (int next: unused) {
/* We can use this if either
*
* 1. the sequence is empty, so we're first in line, or
* 2. the sequence is not empty, but we sum to a perfect square
* with the previous term.
*/
if (soFar.isEmpty() ||
isPerfectSquare(next + soFar[soFar.size() - 1])) {
/* See what happens if we extend with this number. */
auto result = findSequenceRec(unused - next, soFar + next);
if (result != Nothing) {
return result;
}
}
}
/* Tried all options and none of them worked. Oh well! */
return Nothing;
}
+汉诺塔递归
+假设有三座汉诺塔,start ,temp ,finish
对n层的汉诺塔问题,先考虑n-1层的,随后考虑n-2层,到最后只需要考虑两层问题,两层的汉诺塔非常容易解决,起点为start,终点是temp,临时塔为finish,最后我们得到temp上的两层汉诺塔 这时将start的3移动到finish塔,这时只要将两层汉诺塔转移到finish则完成了三层汉诺塔,这个过程中的起点为temp,终点是finish,临时塔是start 以此类推,四层塔基于三层塔,n
层塔基于n-1
塔,汉诺塔问题解决
+int moveTower(int numDisks, char start, char finish, char temp) {
if (numDisks == 0) {
return 0;
} else {
int movesOne = moveTower(numDisks - 1, start, temp, finish);
moveSingleDisk(start, finish);
int movesTwo = moveTower(numDisks - 1, temp, finish, start);
return 1 + movesOne + movesTwo;
}
}
+]]>
+
+ 课程笔记
+ 数据结构与算法
+
+
+ 课程笔记
+ 数据结构与算法
+ c++
+ 斯坦福
diff --git a/sitemap.txt b/sitemap.txt
index 648ce9986..5aff88471 100644
--- a/sitemap.txt
+++ b/sitemap.txt
@@ -32,9 +32,9 @@ https://thinklive1.github.io/thinklive/28990/
https://thinklive1.github.io/thinklive/33908/
https://thinklive1.github.io/thinklive/14434/
https://thinklive1.github.io/thinklive/28549/
-https://thinklive1.github.io/thinklive/16615/
-https://thinklive1.github.io/thinklive/48468/
https://thinklive1.github.io/thinklive/15197/
+https://thinklive1.github.io/thinklive/48468/
+https://thinklive1.github.io/thinklive/16615/
https://thinklive1.github.io/thinklive/11069/
https://thinklive1.github.io/categories/index.html
https://thinklive1.github.io/about/index.html
@@ -49,9 +49,9 @@ https://thinklive1.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%
https://thinklive1.github.io/tags/JAVA/
https://thinklive1.github.io/tags/%E6%B8%B8%E6%88%8F%E6%9D%82%E8%B0%88/
https://thinklive1.github.io/tags/black-souls/
-https://thinklive1.github.io/tags/%E6%96%AF%E5%9D%A6%E7%A6%8F/
-https://thinklive1.github.io/tags/c/
https://thinklive1.github.io/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/
+https://thinklive1.github.io/tags/c/
+https://thinklive1.github.io/tags/%E6%96%AF%E5%9D%A6%E7%A6%8F/
https://thinklive1.github.io/tags/java/
https://thinklive1.github.io/tags/web%E5%BC%80%E5%8F%91/
https://thinklive1.github.io/tags/%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6/
@@ -60,7 +60,6 @@ https://thinklive1.github.io/tags/%E9%BA%BB%E7%9C%81%E7%90%86%E5%B7%A5/
https://thinklive1.github.io/tags/%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6/
https://thinklive1.github.io/tags/linux/
https://thinklive1.github.io/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/
-https://thinklive1.github.io/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/
https://thinklive1.github.io/tags/vim/
https://thinklive1.github.io/tags/wrpg/
https://thinklive1.github.io/tags/%E9%BE%99%E8%85%BE%E4%B8%96%E7%BA%AA/
@@ -69,30 +68,31 @@ https://thinklive1.github.io/tags/408/
https://thinklive1.github.io/tags/%E5%BD%B1%E5%AD%90%E5%B7%A5%E5%8E%82/
https://thinklive1.github.io/tags/%E4%B8%8D%E4%BA%88%E6%92%AD%E5%87%BA/
https://thinklive1.github.io/tags/%E6%AD%A5%E8%A1%8C%E6%A8%A1%E6%8B%9F%E5%99%A8/
+https://thinklive1.github.io/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/
+https://thinklive1.github.io/tags/%E8%8B%8F%E5%B7%9E%E5%A4%A7%E5%AD%A6/
+https://thinklive1.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
+https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/
https://thinklive1.github.io/tags/hexo/
https://thinklive1.github.io/tags/next/
https://thinklive1.github.io/tags/webstack/
https://thinklive1.github.io/tags/icarus/
-https://thinklive1.github.io/tags/%E8%8B%8F%E5%B7%9E%E5%A4%A7%E5%AD%A6/
-https://thinklive1.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
-https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/
https://thinklive1.github.io/tags/%E7%A7%98%E5%AF%86/
https://thinklive1.github.io/tags/%E8%AE%A1%E7%BB%84/
-https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
https://thinklive1.github.io/tags/%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%AD%A6/
+https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
https://thinklive1.github.io/tags/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
https://thinklive1.github.io/categories/%E8%80%83%E7%A0%94%E7%AC%94%E8%AE%B0/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/
https://thinklive1.github.io/categories/%E6%B8%B8%E6%88%8F%E6%9D%82%E8%B0%88/
-https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%85%B6%E4%BB%96/
+https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/web%E5%BC%80%E5%8F%91/
https://thinklive1.github.io/categories/%E6%B8%B8%E6%88%8F%E6%9D%82%E8%B0%88/black-souls/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
-https://thinklive1.github.io/categories/%E5%BB%BA%E7%AB%99%E7%BB%8F%E9%AA%8C/
https://thinklive1.github.io/categories/%E5%A4%87%E5%BF%98%E5%BD%95/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%BB%84/
+https://thinklive1.github.io/categories/%E5%BB%BA%E7%AB%99%E7%BB%8F%E9%AA%8C/
https://thinklive1.github.io/categories/%E7%A7%98%E5%AF%86/
-https://thinklive1.github.io/categories/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
+https://thinklive1.github.io/categories/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
diff --git a/sitemap.xml b/sitemap.xml
index e6a75bb78..449985c64 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -308,7 +308,7 @@
- https://thinklive1.github.io/thinklive/16615/
+ https://thinklive1.github.io/thinklive/15197/
2023-11-27
@@ -326,7 +326,7 @@
- https://thinklive1.github.io/thinklive/15197/
+ https://thinklive1.github.io/thinklive/16615/
2023-11-27
@@ -445,7 +445,7 @@
- https://thinklive1.github.io/tags/%E6%96%AF%E5%9D%A6%E7%A6%8F/
+ https://thinklive1.github.io/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/
2024-07-21
weekly
0.2
@@ -459,7 +459,7 @@
- https://thinklive1.github.io/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/
+ https://thinklive1.github.io/tags/%E6%96%AF%E5%9D%A6%E7%A6%8F/
2024-07-21
weekly
0.2
@@ -521,13 +521,6 @@
0.2
-
- https://thinklive1.github.io/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/
- 2024-07-21
- weekly
- 0.2
-
-
https://thinklive1.github.io/tags/vim/
2024-07-21
@@ -585,49 +578,56 @@
- https://thinklive1.github.io/tags/hexo/
+ https://thinklive1.github.io/tags/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/next/
+ https://thinklive1.github.io/tags/%E8%8B%8F%E5%B7%9E%E5%A4%A7%E5%AD%A6/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/webstack/
+ https://thinklive1.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/icarus/
+ https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/%E8%8B%8F%E5%B7%9E%E5%A4%A7%E5%AD%A6/
+ https://thinklive1.github.io/tags/hexo/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
+ https://thinklive1.github.io/tags/next/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90/
+ https://thinklive1.github.io/tags/webstack/
+ 2024-07-21
+ weekly
+ 0.2
+
+
+
+ https://thinklive1.github.io/tags/icarus/
2024-07-21
weekly
0.2
@@ -648,14 +648,14 @@
- https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
+ https://thinklive1.github.io/tags/%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%AD%A6/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/tags/%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF%E5%A4%A7%E5%AD%A6/
+ https://thinklive1.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
2024-07-21
weekly
0.2
@@ -692,14 +692,14 @@
- https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/
+ https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%85%B6%E4%BB%96/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E5%85%B6%E4%BB%96/
+ https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/
2024-07-21
weekly
0.2
@@ -734,21 +734,21 @@
- https://thinklive1.github.io/categories/%E5%BB%BA%E7%AB%99%E7%BB%8F%E9%AA%8C/
+ https://thinklive1.github.io/categories/%E5%A4%87%E5%BF%98%E5%BD%95/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/categories/%E5%A4%87%E5%BF%98%E5%BD%95/
+ https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%BB%84/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%BB%84/
+ https://thinklive1.github.io/categories/%E5%BB%BA%E7%AB%99%E7%BB%8F%E9%AA%8C/
2024-07-21
weekly
0.2
@@ -762,14 +762,14 @@
- https://thinklive1.github.io/categories/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
+ https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
2024-07-21
weekly
0.2
- https://thinklive1.github.io/categories/%E8%AF%BE%E7%A8%8B%E7%AC%94%E8%AE%B0/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/
+ https://thinklive1.github.io/categories/%E8%BF%AA%E7%91%9E%E5%85%8B%E6%8B%89/
2024-07-21
weekly
0.2
diff --git a/steamgames/index.html b/steamgames/index.html
index 09622bb94..f0de46a8f 100644
--- a/steamgames/index.html
+++ b/steamgames/index.html
@@ -6305,14 +6305,14 @@ Steam游戏库
站点总字数:
- 723k
+ 386k
diff --git a/tags/408/index.html b/tags/408/index.html
index 3e9d5e4a3..b00a89a8b 100644
--- a/tags/408/index.html
+++ b/tags/408/index.html
@@ -321,14 +321,14 @@ 408
站点总字数:
- 723k
+ 386k
diff --git a/tags/JAVA/index.html b/tags/JAVA/index.html
index 3535f4cd0..665e5c70a 100644
--- a/tags/JAVA/index.html
+++ b/tags/JAVA/index.html
@@ -321,14 +321,14 @@ JAVA
站点总字数:
- 723k
+ 386k
diff --git a/tags/black-souls/index.html b/tags/black-souls/index.html
index 443b2d205..238144fe5 100644
--- a/tags/black-souls/index.html
+++ b/tags/black-souls/index.html
@@ -306,8 +306,8 @@ black souls
@@ -326,8 +326,8 @@ black souls
@@ -361,14 +361,14 @@ black souls
站点总字数:
- 723k
+ 386k
diff --git a/tags/c/index.html b/tags/c/index.html
index 274c8a36b..b3fdea309 100644
--- a/tags/c/index.html
+++ b/tags/c/index.html
@@ -286,8 +286,8 @@ c++
@@ -326,8 +326,8 @@ c++
@@ -361,14 +361,14 @@ c++
站点总字数:
- 723k
+ 386k
diff --git a/tags/hexo/index.html b/tags/hexo/index.html
index 7637de58f..c2fa827b9 100644
--- a/tags/hexo/index.html
+++ b/tags/hexo/index.html
@@ -321,14 +321,14 @@ hexo
站点总字数:
- 723k
+ 386k
diff --git a/tags/icarus/index.html b/tags/icarus/index.html
index b092f872a..2ac9d8d3a 100644
--- a/tags/icarus/index.html
+++ b/tags/icarus/index.html
@@ -321,14 +321,14 @@ icarus
站点总字数:
- 723k
+ 386k
diff --git a/tags/index.html b/tags/index.html
index 083550ed0..2cef7d3f2 100644
--- a/tags/index.html
+++ b/tags/index.html
@@ -314,14 +314,14 @@ tags
站点总字数:
- 723k
+ 386k
diff --git a/tags/java/index.html b/tags/java/index.html
index 232383f7e..3d5894041 100644
--- a/tags/java/index.html
+++ b/tags/java/index.html
@@ -321,14 +321,14 @@ java
站点总字数:
- 723k
+ 386k
diff --git a/tags/linux/index.html b/tags/linux/index.html
index 42ea07c45..3f4a65c20 100644
--- a/tags/linux/index.html
+++ b/tags/linux/index.html
@@ -361,14 +361,14 @@ linux
站点总字数:
- 723k
+ 386k
diff --git a/tags/next/index.html b/tags/next/index.html
index 8523a947c..020845b37 100644
--- a/tags/next/index.html
+++ b/tags/next/index.html
@@ -321,14 +321,14 @@ next
站点总字数:
- 723k
+ 386k
diff --git a/tags/pandas/index.html b/tags/pandas/index.html
index 5195812a6..f0476a43e 100644
--- a/tags/pandas/index.html
+++ b/tags/pandas/index.html
@@ -341,14 +341,14 @@ pandas
站点总字数:
- 723k
+ 386k
diff --git a/tags/python/index.html b/tags/python/index.html
index e067a2fe2..43f8df910 100644
--- a/tags/python/index.html
+++ b/tags/python/index.html
@@ -381,14 +381,14 @@ python
站点总字数:
- 723k
+ 386k
diff --git a/tags/vim/index.html b/tags/vim/index.html
index 7da40a5a0..ceb40cc71 100644
--- a/tags/vim/index.html
+++ b/tags/vim/index.html
@@ -321,14 +321,14 @@ vim
站点总字数:
- 723k
+ 386k
diff --git a/tags/webstack/index.html b/tags/webstack/index.html
index 26c0de670..d10bf66ef 100644
--- a/tags/webstack/index.html
+++ b/tags/webstack/index.html
@@ -321,14 +321,14 @@ webstack
站点总字数:
- 723k
+ 386k
diff --git "a/tags/web\345\274\200\345\217\221/index.html" "b/tags/web\345\274\200\345\217\221/index.html"
index ff2d81204..a8cd13b9d 100644
--- "a/tags/web\345\274\200\345\217\221/index.html"
+++ "b/tags/web\345\274\200\345\217\221/index.html"
@@ -321,14 +321,14 @@ web开发
站点总字数:
- 723k
+ 386k
diff --git a/tags/wrpg/index.html b/tags/wrpg/index.html
index 0e0324c3a..134b41f12 100644
--- a/tags/wrpg/index.html
+++ b/tags/wrpg/index.html
@@ -321,14 +321,14 @@ wrpg
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\344\270\215\344\272\210\346\222\255\345\207\272/index.html" "b/tags/\344\270\215\344\272\210\346\222\255\345\207\272/index.html"
index af1d2075e..4d987a666 100644
--- "a/tags/\344\270\215\344\272\210\346\222\255\345\207\272/index.html"
+++ "b/tags/\344\270\215\344\272\210\346\222\255\345\207\272/index.html"
@@ -321,14 +321,14 @@ 不予播出
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\344\270\255\345\233\275\347\247\221\345\255\246\346\212\200\346\234\257\345\244\247\345\255\246/index.html" "b/tags/\344\270\255\345\233\275\347\247\221\345\255\246\346\212\200\346\234\257\345\244\247\345\255\246/index.html"
index 5a8a0bc86..41feff02a 100644
--- "a/tags/\344\270\255\345\233\275\347\247\221\345\255\246\346\212\200\346\234\257\345\244\247\345\255\246/index.html"
+++ "b/tags/\344\270\255\345\233\275\347\247\221\345\255\246\346\212\200\346\234\257\345\244\247\345\255\246/index.html"
@@ -321,14 +321,14 @@ 中国科学技术大学
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\344\274\257\345\205\213\345\210\251/index.html" "b/tags/\344\274\257\345\205\213\345\210\251/index.html"
index b63fa1f2e..020c1533d 100644
--- "a/tags/\344\274\257\345\205\213\345\210\251/index.html"
+++ "b/tags/\344\274\257\345\205\213\345\210\251/index.html"
@@ -401,14 +401,14 @@ 伯克利
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\345\214\227\344\272\254\345\244\247\345\255\246/index.html" "b/tags/\345\214\227\344\272\254\345\244\247\345\255\246/index.html"
index 6eb41d8ed..ee1fa3272 100644
--- "a/tags/\345\214\227\344\272\254\345\244\247\345\255\246/index.html"
+++ "b/tags/\345\214\227\344\272\254\345\244\247\345\255\246/index.html"
@@ -341,14 +341,14 @@ 北京大学
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\345\267\253\345\270\2102/index.html" "b/tags/\345\267\253\345\270\2102/index.html"
index 25e1d7e97..5fdcb5404 100644
--- "a/tags/\345\267\253\345\270\2102/index.html"
+++ "b/tags/\345\267\253\345\270\2102/index.html"
@@ -321,14 +321,14 @@ 巫师2
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\345\275\261\345\255\220\345\267\245\345\216\202/index.html" "b/tags/\345\275\261\345\255\220\345\267\245\345\216\202/index.html"
index eb36ac427..8b2ac46fb 100644
--- "a/tags/\345\275\261\345\255\220\345\267\245\345\216\202/index.html"
+++ "b/tags/\345\275\261\345\255\220\345\267\245\345\216\202/index.html"
@@ -321,14 +321,14 @@ 影子工厂
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html" "b/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html"
index f94d65eb6..fa96d99ad 100644
--- "a/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html"
+++ "b/tags/\346\223\215\344\275\234\347\263\273\347\273\237/index.html"
@@ -344,14 +344,14 @@ 操作系统
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\225\260\346\215\256\347\247\221\345\255\246/index.html" "b/tags/\346\225\260\346\215\256\347\247\221\345\255\246/index.html"
index 5a42d5662..c7c2698c6 100644
--- "a/tags/\346\225\260\346\215\256\347\247\221\345\255\246/index.html"
+++ "b/tags/\346\225\260\346\215\256\347\247\221\345\255\246/index.html"
@@ -361,14 +361,14 @@ 数据科学
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html" "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html"
index 3c1461713..393636305 100644
--- "a/tags/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html"
+++ "b/tags/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225/index.html"
@@ -424,14 +424,14 @@ 数据结构与算法
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\226\257\345\235\246\347\246\217/index.html" "b/tags/\346\226\257\345\235\246\347\246\217/index.html"
index 5ccf61628..1b679364e 100644
--- "a/tags/\346\226\257\345\235\246\347\246\217/index.html"
+++ "b/tags/\346\226\257\345\235\246\347\246\217/index.html"
@@ -286,8 +286,8 @@ 斯坦福
@@ -306,8 +306,8 @@ 斯坦福
@@ -341,14 +341,14 @@ 斯坦福
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\255\245\350\241\214\346\250\241\346\213\237\345\231\250/index.html" "b/tags/\346\255\245\350\241\214\346\250\241\346\213\237\345\231\250/index.html"
index 9140b5997..b59583357 100644
--- "a/tags/\346\255\245\350\241\214\346\250\241\346\213\237\345\231\250/index.html"
+++ "b/tags/\346\255\245\350\241\214\346\250\241\346\213\237\345\231\250/index.html"
@@ -321,14 +321,14 @@ 步行模拟器
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" "b/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html"
index d8320aa7b..09d2f3f2e 100644
--- "a/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html"
+++ "b/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html"
@@ -326,8 +326,8 @@ 游戏杂谈
@@ -346,8 +346,8 @@ 游戏杂谈
@@ -381,14 +381,14 @@ 游戏杂谈
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\347\240\224distance/index.html" "b/tags/\347\240\224distance/index.html"
index 4117cba6a..685625ce3 100644
--- "a/tags/\347\240\224distance/index.html"
+++ "b/tags/\347\240\224distance/index.html"
@@ -364,14 +364,14 @@ 研distance
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\347\247\230\345\257\206/index.html" "b/tags/\347\247\230\345\257\206/index.html"
index 53c96e27e..436891d64 100644
--- "a/tags/\347\247\230\345\257\206/index.html"
+++ "b/tags/\347\247\230\345\257\206/index.html"
@@ -404,14 +404,14 @@ 秘密
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\347\263\273\347\273\237\347\256\241\347\220\206/index.html" "b/tags/\347\263\273\347\273\237\347\256\241\347\220\206/index.html"
index 0cfc1c51b..199b096e7 100644
--- "a/tags/\347\263\273\347\273\237\347\256\241\347\220\206/index.html"
+++ "b/tags/\347\263\273\347\273\237\347\256\241\347\220\206/index.html"
@@ -321,14 +321,14 @@ 系统管理
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\347\274\226\347\250\213\345\267\245\345\205\267/index.html" "b/tags/\347\274\226\347\250\213\345\267\245\345\205\267/index.html"
index c1232f667..9a1a4db89 100644
--- "a/tags/\347\274\226\347\250\213\345\267\245\345\205\267/index.html"
+++ "b/tags/\347\274\226\347\250\213\345\267\245\345\205\267/index.html"
@@ -361,14 +361,14 @@ 编程工具
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\213\217\345\267\236\345\244\247\345\255\246/index.html" "b/tags/\350\213\217\345\267\236\345\244\247\345\255\246/index.html"
index c09741090..1e710a60a 100644
--- "a/tags/\350\213\217\345\267\236\345\244\247\345\255\246/index.html"
+++ "b/tags/\350\213\217\345\267\236\345\244\247\345\255\246/index.html"
@@ -381,14 +381,14 @@ 苏州大学
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/index.html" "b/tags/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/index.html"
index c393cba83..1bc574e90 100644
--- "a/tags/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/index.html"
+++ "b/tags/\350\256\241\347\256\227\346\234\272\347\273\204\346\210\220/index.html"
@@ -321,14 +321,14 @@ 计算机组成
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html" "b/tags/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html"
index bd0363426..16517d298 100644
--- "a/tags/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html"
+++ "b/tags/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/index.html"
@@ -341,14 +341,14 @@ 计算机网络
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\256\241\347\273\204/index.html" "b/tags/\350\256\241\347\273\204/index.html"
index 82ca850b8..fa9d4ce16 100644
--- "a/tags/\350\256\241\347\273\204/index.html"
+++ "b/tags/\350\256\241\347\273\204/index.html"
@@ -321,14 +321,14 @@ 计组
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html" "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html"
index 6fff76549..bdb0e6e71 100644
--- "a/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html"
+++ "b/tags/\350\257\273\344\271\246\347\254\224\350\256\260/index.html"
@@ -321,14 +321,14 @@ 读书笔记
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\257\276\347\250\213\347\254\224\350\256\260/index.html" "b/tags/\350\257\276\347\250\213\347\254\224\350\256\260/index.html"
index f880275ab..440d90dc2 100644
--- "a/tags/\350\257\276\347\250\213\347\254\224\350\256\260/index.html"
+++ "b/tags/\350\257\276\347\250\213\347\254\224\350\256\260/index.html"
@@ -326,8 +326,8 @@ 课程笔记
@@ -346,8 +346,8 @@ 课程笔记
@@ -466,8 +466,8 @@ 课程笔记
@@ -504,14 +504,14 @@ 课程笔记
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\257\276\347\250\213\347\254\224\350\256\260/page/2/index.html" "b/tags/\350\257\276\347\250\213\347\254\224\350\256\260/page/2/index.html"
index a720372cb..dee2e0d63 100644
--- "a/tags/\350\257\276\347\250\213\347\254\224\350\256\260/page/2/index.html"
+++ "b/tags/\350\257\276\347\250\213\347\254\224\350\256\260/page/2/index.html"
@@ -286,8 +286,8 @@ 课程笔记
@@ -404,14 +404,14 @@ 课程笔记
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\350\277\252\347\221\236\345\205\213\346\213\211/index.html" "b/tags/\350\277\252\347\221\236\345\205\213\346\213\211/index.html"
index 0b48f4470..90ce40855 100644
--- "a/tags/\350\277\252\347\221\236\345\205\213\346\213\211/index.html"
+++ "b/tags/\350\277\252\347\221\236\345\205\213\346\213\211/index.html"
@@ -286,8 +286,8 @@ 迪瑞克拉
@@ -306,8 +306,8 @@ 迪瑞克拉
@@ -364,14 +364,14 @@ 迪瑞克拉
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\351\272\273\347\234\201\347\220\206\345\267\245/index.html" "b/tags/\351\272\273\347\234\201\347\220\206\345\267\245/index.html"
index 95bb7d01f..8ba98bced 100644
--- "a/tags/\351\272\273\347\234\201\347\220\206\345\267\245/index.html"
+++ "b/tags/\351\272\273\347\234\201\347\220\206\345\267\245/index.html"
@@ -381,14 +381,14 @@ 麻省理工
站点总字数:
- 723k
+ 386k
diff --git "a/tags/\351\276\231\350\205\276\344\270\226\347\272\252/index.html" "b/tags/\351\276\231\350\205\276\344\270\226\347\272\252/index.html"
index 45331eb6a..25509a1ac 100644
--- "a/tags/\351\276\231\350\205\276\344\270\226\347\272\252/index.html"
+++ "b/tags/\351\276\231\350\205\276\344\270\226\347\272\252/index.html"
@@ -321,14 +321,14 @@ 龙腾世纪
站点总字数:
- 723k
+ 386k
diff --git a/thanks/index.html b/thanks/index.html
index 1b609759f..50eaa80f5 100644
--- a/thanks/index.html
+++ b/thanks/index.html
@@ -316,14 +316,14 @@ And you
站点总字数:
- 723k
+ 386k
diff --git a/thinklive/11069/index.html b/thinklive/11069/index.html
index e2ab16156..6c8f501b5 100644
--- a/thinklive/11069/index.html
+++ b/thinklive/11069/index.html
@@ -344,14 +344,14 @@
19k
+ 12k
-
@@ -731,14 +731,14 @@ 还有更多的 Vim 小窍门吗?
站点总字数:
- 723k
+ 386k
diff --git a/thinklive/11086/index.html b/thinklive/11086/index.html
index ea08aeb7e..2941006c4 100644
--- a/thinklive/11086/index.html
+++ b/thinklive/11086/index.html
@@ -344,14 +344,14 @@
3.7k
+ 2.5k
-
@@ -469,8 +469,8 @@ 进阶
@@ -504,14 +504,14 @@ 进阶
站点总字数:
- 723k
+ 386k
diff --git a/thinklive/14434/index.html b/thinklive/14434/index.html
index f8fde1b22..a788604e8 100644
--- a/thinklive/14434/index.html
+++ b/thinklive/14434/index.html
@@ -333,14 +333,14 @@
2.4k
+ 2.1k
-
@@ -424,13 +424,13 @@ 度量
@@ -464,14 +464,14 @@ 度量
站点总字数:
- 723k
+ 386k
diff --git a/thinklive/15197/index.html b/thinklive/15197/index.html
index 6b29350f2..3f2a316d6 100644
--- a/thinklive/15197/index.html
+++ b/thinklive/15197/index.html
@@ -32,8 +32,8 @@
-
+
@@ -338,14 +338,14 @@
5.9k
+ 3.2k
-
@@ -466,8 +466,8 @@ 匿名函数
c语言部分
-基本函数构成
-将数组传递为函数参数
-1 | int fcname(int arg[],int n) |
一些查找和排序算法
+二分查找法 最坏情况:log2n
@@ -895,14 +895,14 @@19k + 12k
-2024年贺图
站点总字数: - 723k + 386k不过还有更好的方法吗?杀了一个人的人就必须死?如果过失杀人呢?故意杀人必须死?如果被杀人曾害杀人者妻离子散呢?没有仇怨杀人必须死?如果被杀者身上有传染病,不烧掉尸体就会让周边化为地狱呢?杀好人必须死?如果好人只是伪装,私底下男盗女娼呢?
无论如何都很难归纳出绝对正确的可以杀人的场合,因此只能这么说,只要行动,就会有犯下罪孽的可能性,即使什么都不做也是一样,归根到底,道德议题都会是虚无的,只有圈定一个前提,才能讨论一个局部解,那么不同群体的局部解又会不同
因此,只要杀人都是罪,这种观点未必对也未必错,无法证实也无法证伪,只是一个观点,如果说这种观点错,同样也可以否定其他观点,这就是为什么人类文明发展到现在也依旧有无数的罪恶 +
复仇篇的发展远比英雄篇好猜,正义,英雄,这种概念是人类社会出现后才慢慢成型的事物,复仇则在更早之前就会出现
+证据就是,我小时候收养了流浪狗,不服管教被我妈追着打过,因此它一看到我妈就夹着尾巴,这是恐惧,畏惧,但到了适当的时候就会产生仇恨,仇恨就是这样一种原始的感情,例如农村的狗对着闯进领地的人狂叫,也是对侵占领地这种行为的“复仇”
+复仇只要伴随着生物本能就可以完成,这样的简单粗暴让其很多时候都不符合道德标准,正义更无从谈起,但作为人性中残留的兽性,这是必不可少的
+因此,复仇没什么好绕的,只要去杀戮就行了,但为什么哈姆雷特这样的人会犹豫呢?这不过是因为他当了太久的人,忘了怎么当裸猿,也就是说复仇很简单,复不复仇才是麻烦的地方,脱下人皮经典,再穿上又难了
我是很不擅长阅读理解的那类人,语文很难考到平均分,因此我一般也看不出作者有什么私货,除了硬塞lgbt,黑龙也是龙这种太夸张的,因为我懒得猜作者到底什么意思,所以反而是最宽容的一类读者,对我来说作者写完的一瞬间,作品的解释权就被我这个读者垄断了,作者想要解释作品也只能以一个读者的身份来
+因此我倒不觉得村正反战败,我看出的是反杀人,杀任何人都有可能杀错,所以不要杀比较好,这种说法很极端,因为别人打不过了的话难道不反抗吗?所以这个说法还有补丁,心怀大爱的人就不要反抗,以肉饲鹰,没有这么高尚的人以牙还牙也无所谓,只是不要觉得自己就是对的。这样说完了还是很极端,难道世界上不存在正义的战争,怎么就不能觉得自己是正义的?但是还有补丁,这是从宏观视角看的,因为缺少前提的情况下,恶人的一命和善人的一命没有方法裁量,善与恶也难以分辨,这个前提取决于不同的人和不同的价值观,也就是换一个朴素正义感的视角,善人杀恶人就是天经地义的正义。
+这就绕了个大圈子回到了现实世界,为什么要这么麻烦呢,或者说为什么要这么极端呢?因为村正是为了醋包饺子,世界观下平民几乎没有半点希望,单人的武力可以灭国,毫无节制的强,你杀我我杀你,没几轮地球上就没人了,在这种特定情况下,很难说需不需要社会的存在,也很难说什么是道德准则,武力的使用会产生冲突,稍微多冲突几次地球就没人了,你以一个平民的视角看,不要使用任何武力也是个不错的结果,平民和那些超能力者已经不是同类了
+绕到这种程度还是很极端,为什么就要因噎废食,说不定在地球没人前,正义的超人们把邪恶方杀完了,又可以建立一个天国。这当然也可以,唯一的问题是会死人,死掉很多无辜的人,也未必能成功,对那些,比如流弹打死的人来说,正义又成了邪恶
+到最后我们就会发现一个朴素的道理,好人一次也不能出错,否则就成了恶人,村正部分角色的观点是,好人难做,那就什么都不做好了,或者以当恶人的觉悟去做好事
+论证到这个结论,还是很极端,因为好心干了坏事的好人也可以认为还是好人,好人战斗死的人很可能比不战斗死的人少,更何况可能真的有超人,永远好心干好事,这样的论证逐渐开始虚无了,因为这样的假设可以无数次做下去
+因此以上的一切只会是观点,无法像数学证明题一样完美的QED,同理,认为有私货的人也只是观点,我也可以假设作者的所想和我这些观点一样几乎等于什么都没说,因为换个类似现实的世界观一切就不同了
二分查找法 最坏情况:log2n 寻找最小排序 向前插入算法
-合并算法接受两个排序的 列出并将它们组合成一个 排序列表。 ● 虽然两个列表都是非空的,但比较它们的 第一要素。 删除较小的元素 并将其附加到输出。 ● 一旦一个列表为空,添加所有元素 另一个列表输出。 ● 它运行时间为 O(n),其中 n 是总数 合并的元素数量。 无限递归后的合并算法 复杂度:nlog2n
-容器类
-set(集合):无序不允许重复的容器类,可以添加删除元素 You can add a value to a Set by writing set += value; s. ● You can remove a value from a Set by writing set -= value; ● You can check if a value exists in a Set by writing set.contains(value)
map(键值对的集合) 如果没有对应key的value,返回默认值(见定义文件) `vector vector的remove根据移除元素的索引有1-n的复杂度,移除尾部为O(1),如果不在意索引,可以交换要移除元素和尾部元素再移除
哈希表
-哈希表的负载因子α表示元素和表格键数量的比,决定了查找速度
-检查表中是否存在元素
-● 计算元素的散列码。 ● 跳转到表格中的那个位置。 ● 向前扫描——必要时环绕——直到项目或一个 发现空插槽。
-将元素插入表中
-● 如果项目已经存在,什么也不做。 ● 否则,跳转到元素哈希码给定的槽。 向前走——必要时环绕——直到一个空白点或 找到墓碑插槽。 然后,将项目放在那里。
-从表中删除一个元素
-● 跳转到由元素的散列码给定的槽。 ● 向前走——必要时环绕——直到物品或 发现空插槽。 如果找到该项目,请将其替换为 墓碑。
-“罗宾汉哈希表”
--
-
- 如果插入的值比其将插入的位置的值距离索引更远,则替换插入值和当前值 -
- 删除值时,将后其离原键远的元素前移 -
- ★ 罗宾汉哈希一览 ★ -
- 检查表中是否存在元素: -
- ● 跳转到表中由元素的散列码给出的位置。 -
- ● 向前扫描——如有必要环绕——记录有多少步 你拿走了。 当您找到该项目、找到一个空白槽或找到一个 离家更近的空位比你走的步数还多。 -
- 将元素插入表中: -
- ● 如果该元素已在表中,则什么也不做。 -
- ● 跳转到由元素的散列码给出的表槽。 向前扫描 - 换行 如有必要,四处走走——记录所走的步数。 如果你找到一个 空插槽,将元素放在那里。 否则,如果当前插槽已满并且 比您插入的元素更靠近家,将要插入的项目放在那里, 替换那个位置的元素,然后继续插入,就好像你 正在插入被置换的元素。 -
- 从表中删除一个元素: -
- ● 跳转到由元素的散列码给定的槽。 -
- ● 向前走——如有必要,环绕——直到物品或空槽被放置 成立。 如果找到该项目,请将其删除。 然后,继续前进——包裹 around as necessary – 将表中的元素向后移动一个槽位,直到 找到空插槽或位于其原始位置的项目 -
string类
-str::npos表示容器的最后一个成员位置 if (s.find("e") != string::npos) //find函数找不到时返回npos if s in str: string obj; obj.substr(int pos) //pos为要包含的第一个字符串的位置 std::string a = "0123456789abcdefghij";
-
|
`replace和insert str1.insert(start, str2) str1.replace(start, length, str2)
-一些实现
-优先队列
-# include "HeapPQueue.h" |
计数排序
-首先算出最大值,然后用一个数组的索引存储待排序数组的成员,其索引对应值存储出现次数,然后用两个同步的for循环和递增的next参数表示排序中的索引值来进行排序(也就是重新赋值)
-/* Given a Vector<int>, returns the largest number in that Vector. */ |
错题集
-递归的效率优化
-每次递归都会创造所有变量的临时复制 基于递归的这种性质,它会需要巨大的时间和空间来完成任务,并且会造成算力上的浪费。 通过记忆表机制能部分解决这个问题,方法是每次递归的返回值都会按索引存入一个表格,并且每次递归前查询表格中是否有结果,这样可以让每个临时副本的运算结果能被所有函数共享。
-递归计算给定元素的不同结构哈夫曼树的数量
-对每个给定元素集来说,首先要做到是确定根节点元素是第几个大的元素,确定之后,左子树和右子树的元素数也随之确定,在此之后分别对左节点和右节点作为根节点做同样的递归
-
|
递归解决吃巧克力问题
-求出吃法数量
-if (numSquares<0) |
打印每种吃法
-`需要一个辅助向量储存历史记录
-/* Print all ways to eat numSquares more squares, given that we've |
递归解决翻煎饼问题
-bool isSorted(Stack<double> pancakes) { |
递归解决天平问题
-bool isMeasurableRec(int amount, const Vector<int>& weights, int index) { |
想象一下,我们首先将要测量的数量(称为 n )放在天平的左侧。 这使得规模上的不平衡等于 n 。 想象一下,有某种方法可以测量 n 。 如果我们一次将一个重量放在秤上,我们可以查看第一个重量的放置位置(假设它的重量为 w )。 它必须:
--
-
- 向左走,使规模上的净不平衡 n + w ,或 -
- 向右走,使规模上的净不平衡 n – w ,或 -
- 根本不习惯,留下净不平衡 n 。 -
如果确实有可能测量 n ,那么这三个选项之一必须是实现它的方法,即使我们不知道它是哪一个。 然后我们要问的问题是,是否有可能使用剩余的权重来衡量新的净失衡——我们可以递归地确定! 另一方面,如果无法测量 n ,那么无论我们选择哪个选项,我们都会发现没有办法使用剩余的权重来使一切平衡!
-如果我们递归地进行,我们在这里,我们需要考虑我们的基本情况。 我们可以选择的选项有很多。 一个简单的方法如下:假设我们根本没有任何重量,我们被要求查看是否可以不使用重量来测量某些重量。 在什么情况下我们可以这样做? 好吧,如果我们称重的东西有一个非零重量,我们就不可能测量它——把它放在秤上会使它倾斜到某一边,但这并不能告诉我们它有多少重量。 另一方面,如果我们称量的东西是完全失重的,那么把它放在秤上也不会导致它倾斜,让我们相信它确实是失重的! 因此,作为我们的基本情况,我们会说当我们减少到没有剩余权重时, ,我们可以精确测量n 如果 n = 0 。 考虑到这一点,这是我们的代码:
-递归解决找零问题
-不使用记忆的情况
-`从第一个硬币开始遍历,并穷举它的所有枚数,将其作为下一枚硬币的参数传递
-int fewestCoinsFor(int cents, const Set<int>& coins) { |
使用记忆进行优化
-/* How few coins are needed to make the total, given that we can only use |
递归穷举付账单
-递归机制:对第一个人来说,0-total所有金额都会付一遍,随后传递给下一个人,当只有一人时,付清所有余额并打印账单 传递参数:string,int的映射存储目前为止的账单,string集合存储所有付账者
-void listPossiblePaymentsRec(int total, const Set<string>& people,const Map<string, int>& payments) { |
递归寻找完全平方数列
-主要参数为sofar——用于存储目前的序列和一个set用于存储还没放入数列的数字,`确保这两者同时被传递,且其并集为所有数字
-Optional<Vector<int>> findSquareSequence(int n) { |
汉诺塔递归
-假设有三座汉诺塔,start ,temp ,finish
对n层的汉诺塔问题,先考虑n-1层的,随后考虑n-2层,到最后只需要考虑两层问题,两层的汉诺塔非常容易解决,起点为start,终点是temp,临时塔为finish,最后我们得到temp上的两层汉诺塔 这时将start的3移动到finish塔,这时只要将两层汉诺塔转移到finish则完成了三层汉诺塔,这个过程中的起点为temp,终点是finish,临时塔是start 以此类推,四层塔基于三层塔,n
层塔基于n-1
塔,汉诺塔问题解决
int moveTower(int numDisks, char start, char finish, char temp) { |
-
-
- 更好的C C++支持
命令式编程
,一种编程风格,其中程序按顺序执行的命令序列。从这个意义上讲,C++ 可以看作是对C 编程语言,使日常命令式编程更加直观和更容易使用。课程阅读器的这一部分介绍了一些 C++ 最常用的库,包括标准模板库,并展示了如何使用这些库来构建命令程式。 此外,它探索了最初出现在 C++ 语言中的新原语。C 编程语言,即指针、C 字符串和预处理器。
- - 数据抽象 -
C++与其兄弟C的最大区别在于_数据抽象_,程序执行的方式可以与程序执行的方式分开 程序员谈论那个程序。
--
-
- 面向对象编程 -
. 面向对象编程是一种完全不同的方式考虑程序设计,可以极大地简化复杂的软件系统。 钥匙 面向对象背后的概念很简单,但要真正体会到面向对象的力量 编程,您将需要一次又一次地看到它的运行情况。 这部分课程 读者探索了面向对象编程中的主要概念以及如何在 C++ 中实现它继承和多态。
--
-
- 泛型编程 -
泛型编程是一种编程风格,旨在构建可以解决一系列远远超出最初设想的问题的软件
-履行。 虽然泛型编程的完整处理远远超出了介绍性的范围C++ 编程课,泛型编程的许多思想都可以访问并且可以从根本上改变了您对 C++ 编程的看法。
const
-Can’t declare non-const reference to const variable Can’t declare non-const reference to const vari
--
模板
-函数指针:将函数作为对象传递
-stl
-sequence:线性,有顺序 associative:不一定线性,有索引机制(map)
-vector:有顺序的相同类型的数据集合,大小可控制 ---子属性:size:元素数量 ---capacity:单个元素大小 vector最常用,deque用于首部插入场合,list用于多种列表
-associative(关联数组):有顺序的需要有比较方法,无序的需要哈希函数(更快) iterators(迭代器):用于访问容器中的所有数据 --常用函数,begin(),end(),iter++,*(pointer),== !=,=(赋值,复制),
-输入输出流
-First call to std::cin >> creates a command line
-prompt that allows the user to type until they hit enter
-
-
- Each >> ONLY reads until the next whitespace
-
- - Whitespace = tab, space, newline
-
- - Everything after the first whitespace gets saved and
-used the next time std::cin >> is called
-
- - The place its saved is called a buffer -
hashmap的c++实现
-相关函数
-构造函数HashMap(): |
涉及的c++特性
-匿名函数 基本lambda语法 基本形式如下: 【capture】(parameters)->return-type {body}
-typename function() return {x,y,z} 即用{}的参数初始化原函数返回的类型
-ptrdiff_t:用于储存两个指针的差
-conditional_t<func,x,y>如果func为true则x,为false则y
-forward_iterator_tag:单方向迭代器(可读写) ++iter,iter+=1随后返回对自身的引用 iter++,先返回一个对自身的复制,随后iter+=1
-std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
-ate:从文件尾部开始 strsub(start,length) 移动语义(c++11新特性) clss(classname &&) 利用右值引用的部分数据直接初始化新的类,并在初始化之后将右值删除,可以通过std::move()强制转化左值为右值。
-]]>-
+
- 更好的C C++支持
命令式编程
,一种编程风格,其中程序按顺序执行的命令序列。从这个意义上讲,C++ 可以看作是对C 编程语言,使日常命令式编程更加直观和更容易使用。课程阅读器的这一部分介绍了一些 C++ 最常用的库,包括标准模板库,并展示了如何使用这些库来构建命令程式。 此外,它探索了最初出现在 C++ 语言中的新原语。C 编程语言,即指针、C 字符串和预处理器。
+ - 数据抽象 +
C++与其兄弟C的最大区别在于_数据抽象_,程序执行的方式可以与程序执行的方式分开 程序员谈论那个程序。
+-
+
- 面向对象编程 +
. 面向对象编程是一种完全不同的方式考虑程序设计,可以极大地简化复杂的软件系统。 钥匙 面向对象背后的概念很简单,但要真正体会到面向对象的力量 编程,您将需要一次又一次地看到它的运行情况。 这部分课程 读者探索了面向对象编程中的主要概念以及如何在 C++ 中实现它继承和多态。
+-
+
- 泛型编程 +
泛型编程是一种编程风格,旨在构建可以解决一系列远远超出最初设想的问题的软件
+履行。 虽然泛型编程的完整处理远远超出了介绍性的范围C++ 编程课,泛型编程的许多思想都可以访问并且可以从根本上改变了您对 C++ 编程的看法。
const
+Can’t declare non-const reference to const variable Can’t declare non-const reference to const vari
++
模板
+函数指针:将函数作为对象传递
+stl
+sequence:线性,有顺序 associative:不一定线性,有索引机制(map)
+vector:有顺序的相同类型的数据集合,大小可控制 ---子属性:size:元素数量 ---capacity:单个元素大小 vector最常用,deque用于首部插入场合,list用于多种列表
+associative(关联数组):有顺序的需要有比较方法,无序的需要哈希函数(更快) iterators(迭代器):用于访问容器中的所有数据 --常用函数,begin(),end(),iter++,*(pointer),== !=,=(赋值,复制),
+输入输出流
+First call to std::cin >> creates a command line
+prompt that allows the user to type until they hit enter
-
+
- Each >> ONLY reads until the next whitespace
+
+ - Whitespace = tab, space, newline
+
+ - Everything after the first whitespace gets saved and
+used the next time std::cin >> is called
+
+ - The place its saved is called a buffer +
hashmap的c++实现
+相关函数
+构造函数HashMap(): |
涉及的c++特性
+匿名函数 基本lambda语法 基本形式如下: 【capture】(parameters)->return-type {body}
+typename function() return {x,y,z} 即用{}的参数初始化原函数返回的类型
+ptrdiff_t:用于储存两个指针的差
+conditional_t<func,x,y>如果func为true则x,为false则y
+forward_iterator_tag:单方向迭代器(可读写) ++iter,iter+=1随后返回对自身的引用 iter++,先返回一个对自身的复制,随后iter+=1
+std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
+ate:从文件尾部开始 strsub(start,length) 移动语义(c++11新特性) clss(classname &&) 利用右值引用的部分数据直接初始化新的类,并在初始化之后将右值删除,可以通过std::move()强制转化左值为右值。
+]]>二分查找法 最坏情况:log2n 寻找最小排序 向前插入算法
+合并算法接受两个排序的 列出并将它们组合成一个 排序列表。 ● 虽然两个列表都是非空的,但比较它们的 第一要素。 删除较小的元素 并将其附加到输出。 ● 一旦一个列表为空,添加所有元素 另一个列表输出。 ● 它运行时间为 O(n),其中 n 是总数 合并的元素数量。 无限递归后的合并算法 复杂度:nlog2n
+容器类
+set(集合):无序不允许重复的容器类,可以添加删除元素 You can add a value to a Set by writing set += value; s. ● You can remove a value from a Set by writing set -= value; ● You can check if a value exists in a Set by writing set.contains(value)
map(键值对的集合) 如果没有对应key的value,返回默认值(见定义文件) `vector vector的remove根据移除元素的索引有1-n的复杂度,移除尾部为O(1),如果不在意索引,可以交换要移除元素和尾部元素再移除
哈希表
+哈希表的负载因子α表示元素和表格键数量的比,决定了查找速度
+检查表中是否存在元素
+● 计算元素的散列码。 ● 跳转到表格中的那个位置。 ● 向前扫描——必要时环绕——直到项目或一个 发现空插槽。
+将元素插入表中
+● 如果项目已经存在,什么也不做。 ● 否则,跳转到元素哈希码给定的槽。 向前走——必要时环绕——直到一个空白点或 找到墓碑插槽。 然后,将项目放在那里。
+从表中删除一个元素
+● 跳转到由元素的散列码给定的槽。 ● 向前走——必要时环绕——直到物品或 发现空插槽。 如果找到该项目,请将其替换为 墓碑。
+“罗宾汉哈希表”
+-
+
- 如果插入的值比其将插入的位置的值距离索引更远,则替换插入值和当前值 +
- 删除值时,将后其离原键远的元素前移 +
- ★ 罗宾汉哈希一览 ★ +
- 检查表中是否存在元素: +
- ● 跳转到表中由元素的散列码给出的位置。 +
- ● 向前扫描——如有必要环绕——记录有多少步 你拿走了。 当您找到该项目、找到一个空白槽或找到一个 离家更近的空位比你走的步数还多。 +
- 将元素插入表中: +
- ● 如果该元素已在表中,则什么也不做。 +
- ● 跳转到由元素的散列码给出的表槽。 向前扫描 - 换行 如有必要,四处走走——记录所走的步数。 如果你找到一个 空插槽,将元素放在那里。 否则,如果当前插槽已满并且 比您插入的元素更靠近家,将要插入的项目放在那里, 替换那个位置的元素,然后继续插入,就好像你 正在插入被置换的元素。 +
- 从表中删除一个元素: +
- ● 跳转到由元素的散列码给定的槽。 +
- ● 向前走——如有必要,环绕——直到物品或空槽被放置 成立。 如果找到该项目,请将其删除。 然后,继续前进——包裹 around as necessary – 将表中的元素向后移动一个槽位,直到 找到空插槽或位于其原始位置的项目 +
string类
+str::npos表示容器的最后一个成员位置 if (s.find("e") != string::npos) //find函数找不到时返回npos if s in str: string obj; obj.substr(int pos) //pos为要包含的第一个字符串的位置 std::string a = "0123456789abcdefghij";
+
|
`replace和insert str1.insert(start, str2) str1.replace(start, length, str2)
+一些实现
+优先队列
+# include "HeapPQueue.h" |
计数排序
+首先算出最大值,然后用一个数组的索引存储待排序数组的成员,其索引对应值存储出现次数,然后用两个同步的for循环和递增的next参数表示排序中的索引值来进行排序(也就是重新赋值)
+/* Given a Vector<int>, returns the largest number in that Vector. */ |
错题集
+递归的效率优化
+每次递归都会创造所有变量的临时复制 基于递归的这种性质,它会需要巨大的时间和空间来完成任务,并且会造成算力上的浪费。 通过记忆表机制能部分解决这个问题,方法是每次递归的返回值都会按索引存入一个表格,并且每次递归前查询表格中是否有结果,这样可以让每个临时副本的运算结果能被所有函数共享。
+递归计算给定元素的不同结构哈夫曼树的数量
+对每个给定元素集来说,首先要做到是确定根节点元素是第几个大的元素,确定之后,左子树和右子树的元素数也随之确定,在此之后分别对左节点和右节点作为根节点做同样的递归
+
|
递归解决吃巧克力问题
+求出吃法数量
+if (numSquares<0) |
打印每种吃法
+`需要一个辅助向量储存历史记录
+/* Print all ways to eat numSquares more squares, given that we've |
递归解决翻煎饼问题
+bool isSorted(Stack<double> pancakes) { |
递归解决天平问题
+bool isMeasurableRec(int amount, const Vector<int>& weights, int index) { |
想象一下,我们首先将要测量的数量(称为 n )放在天平的左侧。 这使得规模上的不平衡等于 n 。 想象一下,有某种方法可以测量 n 。 如果我们一次将一个重量放在秤上,我们可以查看第一个重量的放置位置(假设它的重量为 w )。 它必须:
+-
+
- 向左走,使规模上的净不平衡 n + w ,或 +
- 向右走,使规模上的净不平衡 n – w ,或 +
- 根本不习惯,留下净不平衡 n 。 +
如果确实有可能测量 n ,那么这三个选项之一必须是实现它的方法,即使我们不知道它是哪一个。 然后我们要问的问题是,是否有可能使用剩余的权重来衡量新的净失衡——我们可以递归地确定! 另一方面,如果无法测量 n ,那么无论我们选择哪个选项,我们都会发现没有办法使用剩余的权重来使一切平衡!
+如果我们递归地进行,我们在这里,我们需要考虑我们的基本情况。 我们可以选择的选项有很多。 一个简单的方法如下:假设我们根本没有任何重量,我们被要求查看是否可以不使用重量来测量某些重量。 在什么情况下我们可以这样做? 好吧,如果我们称重的东西有一个非零重量,我们就不可能测量它——把它放在秤上会使它倾斜到某一边,但这并不能告诉我们它有多少重量。 另一方面,如果我们称量的东西是完全失重的,那么把它放在秤上也不会导致它倾斜,让我们相信它确实是失重的! 因此,作为我们的基本情况,我们会说当我们减少到没有剩余权重时, ,我们可以精确测量n 如果 n = 0 。 考虑到这一点,这是我们的代码:
+递归解决找零问题
+不使用记忆的情况
+`从第一个硬币开始遍历,并穷举它的所有枚数,将其作为下一枚硬币的参数传递
+int fewestCoinsFor(int cents, const Set<int>& coins) { |
使用记忆进行优化
+/* How few coins are needed to make the total, given that we can only use |
递归穷举付账单
+递归机制:对第一个人来说,0-total所有金额都会付一遍,随后传递给下一个人,当只有一人时,付清所有余额并打印账单 传递参数:string,int的映射存储目前为止的账单,string集合存储所有付账者
+void listPossiblePaymentsRec(int total, const Set<string>& people,const Map<string, int>& payments) { |
递归寻找完全平方数列
+主要参数为sofar——用于存储目前的序列和一个set用于存储还没放入数列的数字,`确保这两者同时被传递,且其并集为所有数字
+Optional<Vector<int>> findSquareSequence(int n) { |
汉诺塔递归
+假设有三座汉诺塔,start ,temp ,finish
对n层的汉诺塔问题,先考虑n-1层的,随后考虑n-2层,到最后只需要考虑两层问题,两层的汉诺塔非常容易解决,起点为start,终点是temp,临时塔为finish,最后我们得到temp上的两层汉诺塔 这时将start的3移动到finish塔,这时只要将两层汉诺塔转移到finish则完成了三层汉诺塔,这个过程中的起点为temp,终点是finish,临时塔是start 以此类推,四层塔基于三层塔,n
层塔基于n-1
塔,汉诺塔问题解决
int moveTower(int numDisks, char start, char finish, char temp) { |