默认种子的第一万个数
C++ 标准直接规定了:默认构造的 mt19937(种子 5489),第 10000 次调用得到的数是一个固定值。运行下面这段程序: #include <iostream> #include <random> usi
同一个种子的两个引擎
两个用同一个种子构造的引擎,各抽三个数比一比: #include <iostream> #include <random> using namespace std; int main() { mt19937
补全随机选枢轴
补全随机枢轴快排:在 [l, r] 里随机挑一个下标,把它换到最右边当枢轴。输入是已经排好序的 1..2000,输出「是否排好/是否退化」(比较次数不到固定枢轴的十分之一就算不退化)。随机数用固定种子,结果与机器快慢无关。 (本题用 g++
先洗牌再用固定枢轴
另一种随机化:不改快排本身,排序前先用 shuffle 把数组随机打乱。补全后在已排好序的 1..2000 上跑,输出同样的两项。 (本题用 g++ -std=c++17 -O0 编译。)
用 assert 守住划分
每次划分完,用 assert 验证划分的不变式:枢轴左边都比它小、右边都不比它小,并数一数验过几次划分。排 {17, 24, 15, 13, 23},输出「排序结果(用 - 连)/验过几次」。 (本题用 g++ -std=c++17 -O0
实测期望接不接近 7.4
前面算出随机快排在 5 个元素上的期望比较次数是 37/5 = 7.4。用固定种子跑 20000 次,看平均值和 7.4 差多少:差不到 0.1 就输出「接近」。(抽到哪些数取决于本平台 g++ 的 uniform_int_distribu
随机下标只能在区间里
下面的随机快排把挑枢轴的范围写成了 pick(0, r),会挑到当前区间外面的元素。改对范围,排 1000 个固定种子生成的随机数,输出是否排好。 (本题用 g++ -std=c++17 -O0 编译。)
近似算法给的是什么保证
第 1 步:三条互不相连的边 第 2 步:贪心:两头都收下 第 3 步:贪心:两头都收下 第 4 步:贪心:两头都收下 第 5 步:其实每条挑一头就够 第 6 步:收的点最多是它的两倍 A B C D E F 一个 2-近似算法,保证的是【
NP-hard 意味着什么
某个问题被证明是 NP-hard。这告诉你【0】。
贪心和最优各要几个点
一张七个点的图(顶点覆盖:挑最少的点,让每条边至少有一头被挑中)。贪心和暴力最优各挑了几个点?暴力用位掩码枚举子集: #include <algorithm> #include <iostream> #include