双路快速排序
双路快速排序是快排的优化版。
双路快排的思想是,在待排序数组 [l, r] 的头和尾分别设置一个指针 i = l + 1 和 j = r,使得 arr[l+1...i) <= v;arr(j...r] >= v。这样可以使算法在待排序数组的左右两边同时推进。
问题:
为什么是 arr[l+1...i) <= v 而不是 arr[l...i) <= v?因为 l 被拿去用来做标定点 v 了。
为什么标定点两边都有等于 v 的元素?具体原因请看代码注释。
注释版纯净版public class QuickSort2Ways { public void sort(Comparable[] arr) { int n = arr.length; quickSort2Ways(arr, 0, n - 1); } // 递归调用 quickSort2Ways,对 arr[l...r] 的范围进行排序 private void quickSort2Ways(Comparable[] arr, ...
动态规划之0-1背包问题
最近在学习动态规划(Dynamic programming),其经典问题之一就是 0-1 背包问题。
题目描述为:有一个背包,其容量为 C(capacity)。现在有 n 种不同的物品,编号为 0…n-1,其中每个物品的重量为 w(i),价值为 v(i)。问可以向这个背包中放入哪些物品,使得在不超过背包容量的前提下,物品的价值最大。
函数签名为:int knapsack01(int[] w, int[] v, int C)
下面先说「自顶向下」的记忆化搜索递归解法递归解法的函数签名为:int tryBestValue(int[] w, int[] v, int index, int c)。
对于一个 dp 问题,我们要先明确「状态」和「选择」。状态是,「背包的容量」和「可选的物品」。就是递归参数 index 和 c。选择是,放入背包,或者不放入背包。
对于选择可能好理解,一个物品要么放要么不放。对状态的简单理解就是,如果你用递归的方式求解,递归传入的参数就是状态。这里要排除那些不会变的参数,比如 w 和 v,因为每个物品的重量和价值是不变的,其状态是不需要转移的。
对于背包问题,递归函 ...
不拘一格
《不拘一格》虽说是管理者看的书,但是对于个人我觉得也有一定启发性。
4A 反馈准则
Aim to assist(目的在于帮助)
Actionable(反馈具有可行性)
Appreciate(感激与赞赏)
Accept or discard(接受或拒绝)
在给别人提建议或者是别人给你提建议时可以应用这个准则。
给别人提建议,目的一定要是帮助别人,必须是积极的。而不应该是发泄,恶意中伤别人。不要把个人感情加入到反馈中。同时你的反馈也一定要具备可行性,不要提一些不切实际的要求,或者干脆只反馈,但是没有说具体的可行代替方案。
举个例子。比如,有人在聊天时特别喜欢发「嗯」。不正确的反馈是这样的:你能不能不要一直在聊天时发「嗯」,这样让我看着很烦。正确的反馈是:建议你不要一直在聊天中使用「嗯」这一个字,这样会给对方一种特别敷衍的感觉。你可以使用「嗯嗯」、「好的」等词汇来代替「嗯」。
在别人给你提建议时,你要以积极的心态去听,既不辩护,也不生气,还应该满怀欣赏与感激。不要别人一给你指出问题,就认为对方针对你,故意让你丢脸等。自我保护是人类的本能,这一点也确实挺难做到的,但是面子又不能当饭吃。
...
乔布斯在斯坦福毕业典礼上的演讲(英文)
New York: I am honored to be with you today at your commencement from one of the finest universities in the world. I never graduated from college. Truth be told, this is the closest I’ve ever gotten to a college graduation. Today I want to tell you three stories from my life. That’s it. No big deal. Just three stories.
The first story is about connecting the dots.
I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I real ...
纸书和电子书
书的材质大致可以分为:纸质、手机平板 OLED\LED 屏、Kindle 墨水屏。
纸质书的优点:
物理翻页(我自创的词),两页甚至更多页的内容可以同时对照着看。而电子书只可以同时看一屏(页)的内容。
拿在手里感觉踏实。
没有其他消息干扰。
手机平板 OLED\LED 屏电子书的优点:
携带方便,现在人们出门最不可能忘记带的就是手机了吧,带了手机就相当于带了书。
搜索方便,比如忘记了某个人的身份,可以直接搜索。
容量大,还联网。如果没有限制的话,一部手机可以看到整个世界的书。
支持划词搜索,遇到不认识的汉字、不认识的单词,都可以方便的划词搜索。
Kindle 墨水屏的优点:
接近纸书的视觉感受,护眼。
可以直接在 Amazon 买书,可以看的资源更丰富一些。
没有其他消息干扰。
我买过 Kindle PW4,后来又出掉了,感觉不是很实用。Kindle 的这几个优点对于我来说相当于没有。现在大部分时间都在看手机电子书,但是眼睛也没有感觉不适,反而是有时候看纸书看多了,会觉得眼睛有点迷。其他的功能(搜索、携带、流畅度等)对比手机看书也都要差一些,所以出出掉了。
用手机看书,我一 ...
《谷粒商城》项目错误合集macOS
系统环境:
macOS 版本 Big Sur 11.4
Intellig IDEA 版本 2021.1
DataGrip 版本 2021.1.3
Parallels Desktop 版本 16.1.2 (49151)
CentOS 版本 7
Docker 版本 20.10.7
MySql 版本 5.7
Spring Boot 版本 2.5.1
Spring Cloud 版本 2020.0.3
Spring Cloud Alibaba 版本 2.2.5.RELEASE
Nacos 版本 2.0.2
项目地址:GitHub gulimall-IamXGW
DataGrip 错误:java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost分析:
发生这个错误的时候都是在我重开电脑以后,所以我就想重启一下虚拟机。
解决方法:
在虚拟机终端输入 reboot 命令重启虚拟机,然后在 ...
GCC常用命令总结
GCC 简介要了解 GCC 我觉得有必要先了解一下 GNU 项目。GNU(GNU 是 GNU`s Not Unix 的缩写) 项目是 1984 年由 Richard Stallman 发起的一个免税的慈善项目。该项目的目标非常宏大,就是开发一个完整的类 Unix 的系统,其源码能够不受限制的被修改和传播。GNU 项目已经开发出了一个包含 Unix 系统的所有主要部件的环境,但内核除外,内核是由 Linux 项目独立发展而来的。GNU 环境包括 EMACS 编辑器、GCC 编译器、GDB 调试器、汇编器、连接器、处理二进制文件的工具以及其他一些部件。
GCC 一开始叫做 GNU C Compiler。后来经过不断的发展,不仅仅是支持 C,而且还支持 C++、Objective-C、Ada 和 Go 等多种语言。因此后来 GCC 也就变成了 GNU Compiler Collection 的缩写。GCC 官网。
GCC 使用格式及可选项gcc 的使用格式为:gcc [选项][文件名][选项][文件名]
选项可以分为以下几大类:
(1)总体选项,用于控制编译的整个流程。
-c 对源文件进行编 ...
深入理解计算机系统_3e_第三章家庭作业答案
3.58long decode2(long x, long y, long z) { y -= z; x *= y; long ret = y; ret <<= 63; ret >>= 63; ret ^= x; return ret;}
3.59参考本书的 2.3.4 和 2.3.5,其中有两条定理:
w 位无符号乘法,其结果可能要用 2w 位来表示。但是在 C 语言中 w 位无符号乘法被定义为产生 w 位的值,就是 2w 位的整数乘积的低 w 位表示的值。将一个无符号数截断为 w 位等价于计算模 $2^w$。(这条定理同样适用于补码乘法)。
对于无符号数和补码乘法来说,乘法运算的位级表示都是一样的。
现在让我们看这道题目。
将一个 64 位的补码转换为 128 位的补码数,可以通过以下公式实现:$x=2^{64} \cdot x_h + x_l$,其中 $x_h$ 和 $x_l$ 都是 64 位值。
那么如果计算两个 64 位有符号值 x 和 y 的 128 位乘积,就可以这样表示:$x \ ...
编程打印「的士数」
今天看电影《知无涯着》看到的,所以想编程验证一下。
「的士数」在电影里和在维基百科上看到的故事来源是不一样的,鉴于维基百科更真实一些,所以此处引用维基百科关于「的士数」的故事:
拉马努金病重,哈代前往探望。哈代说:“我乘的士来,车牌号码是 1729,这数真没趣,希望不是不祥之兆。”拉马努金答道:“不,那是个有趣得很的数。可以用两个立方之和来表达而且有两种表达方式的数之中, 1729 是最小的。”(即 ${1729=1^{3}+12^{3}=9^{3}+10^{3}}$,后来这类数称为的士数。)利特尔伍德回应这宗轶闻说:“每个整数都是拉马努金的朋友。”
关于拉马努金:英国皇家学会院士(亚洲第一人),英属印度人,是英属印度史上最著名的数学家之一。
关于哈代:是他在剑桥三一学院任教的时候发现并帮助了拉马努金,可以说是拉马努金的伯乐。
关于利特尔伍德:人们常开玩笑说:利特尔伍德是哈代幻想出来的影子。两人经常合作。
那么该怎么定义「的士数」呢?还是直接引用维基百科:
第 n 个的士数(Taxicab number),一般写作${Ta}(n)$ 或 ${Taxicab}(n)$,定义为最小的 ...
深入理解计算机系统_3e_第二章家庭作业答案
本机环境$ uname -apDarwin Apple0.local 20.3.0 Darwin Kernel Version 20.3.0: Thu Jan 21 00:07:06 PST 2021; root:xnu-7195.81.3~1/RELEASE_X86_64 x86_64 i386
另外,配置原因,题目要求的在不同的机器上运行都只在一台机器上运行的。
知识点:
IEEE 浮点标准是 $V=(-1)^s\times M\times2^E$ 来表示一个数。
假设有 k 位阶码位,n 位尾数位。
Bias 对于规格化和非规格化的值都一样,都等于 $Bias=2^{(k-1)}-1$。
规格化的值:
E=e-Bias。
E 表示 2 的 E 次幂(可能为负数)。
e 为阶码字段 $e_{k-1}…e_1e_0$。
M=1+f。
f 为尾数字段 $\frac{f_{n-1}…f_1f_0} {2^n}$。
非规格化的值:
E=1-Bias。
M=f。
f 同规格化的 f。
2.55/*这一段代码的大部分来自http://csapp.cs.cmu.edu/3e/student ...