思考,快与慢(10-13章)

本文探讨了通过阅读培养逻辑思维的过程,重点关注了大数法则、小数定律中的统计直觉应用,以及锚定效应、可得性启发法等心理偏见现象。作者强调了理性思考的重要性,指出应避免直觉误导,正确评估样本规模并警惕锚定效应和可得性偏见的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在读这本书,想培养自己的逻辑思维能力,这是属于软能力。

目前在做笔记的是:

第10章—大数法则与小数定律。

  • 小样本的出错风险可能高达50%

“对于统计直觉应该抱有一丝怀疑,只要条件允许,都应采用计算方法来确定样本规模,而不是依靠直觉印象来做决定”

  • 信任多于质疑的普遍性偏见

人们总是更会相信小样本,因为我们的直觉系统不擅长质疑,而小样本的信息又十分多,所以我们的直觉系统就会使这个小样本事件合理化连贯,引发联想让我们认为这个信息是正确的

  • 对随机事件作出因果解释必然是错的(人们往往会对随机性的事件中作出有规律性的判断,就像有个人打篮球比赛恰好先投中了几颗球,大家就会认为他今天很顺利把球给他,这是完全没有依据的事情)

最终作者告诉我们生活中许多事情其实只是巧合,包括我们去采样事件都可能是个巧合

第11章—锚定效应在生活中随处可见

主要由我们的两个系统决定我们对锚定效应的反应状态—启发(系统一)与调整(系统二)

  • 对锚定值的调整往往是不足的

人们都会对锚定值进行调整,例如如果被要求音量变小声,我们的锚定值是这个音量,降低了5分贝,但是要求我们调小声的人可能就是希望我们调小10分贝,这时候可能就会出现什么冲突

  • 暗示就是一种锚定效应

人们往往会受到周围环境的因素即暗示影响自己做出某个决定和选择

  • 随机锚定的影响也是以令人不安的方式出现在生活中

例如捐款,如果你问大家愿不愿意捐款5美元或者是愿不愿意捐款100美元,这导致的捐款平均值是非常不同的

  • 锚定效应何时适用呢?

任何时候都会影响到你,除非因为那个锚定值太大了,你的系统二理智系统选择抵制它

书中的这句话很喜欢,说中了环境对人的影响之大“在启发效应下,你的思想和行为也许会被完全不曾留意的刺激所影响,甚至会被你完全没有意识到的刺激所影响,而且这种影响比我们了解和想象的要大得多

第12章—科学地利用可得性启发法

可得性启发法: 你希望估测某一范畴的大小或某一事件的(发生)频率,但你却会提到自己想到相关实例的轻松程度,而这种问题的替代必然会产生系统性错误

  • 意识到自己的偏见有利于团队关系融洽

我们必须通过多个问题对我们自身偏见保持警惕,因为你保持警惕在一定程度上是会避免付出高昂的代价。例如在亲密关系中你的付出,在看新闻案件时你是否会觉得这种案件又是特别高频的)

  • 可得性偏见会影响我们对自己或他人的看法

这里这句话挺有意思的:人们有时依据提取到的内容而非提取的轻松程度来作出判定。你真正了解行为模式的证据就是你知道如何让其发生逆转。(如果我们在对一门课程提出建议前后分别评分,往往后面的分数会比前面的分数要高得多)

以下这些都是我们的系统一会占主导的时候,需要警惕

  • 当他们同时忙于另一件需要付出努力的任务时
  • 因他们刚刚想起生命中的一个快乐片段而心情大好时·如果他们在抑郁量表中得分很低的话。
  • 尽管对这项任务所给话题的了解达不到专家级水准,但他们也算是对此领域了解颇多的新手了
  • 当他们跟着感觉走却拿了高分时
  • 如果他们 (或别人令他们感到) 很强大时
<think>嗯,用户问的是,当有1000个元素需要找出最大的十个时,哪种排序方法最优,选项是速排序、堆排序、二路归并排序和插入排序。首先,我得回忆一下这些排序算法的特点,以及它们在处理这类问题时的优劣。 首先,用户的问题其实是Top K问题,也就是从大量数据中找出前K个最大的元素。这时候,通常不需要对整个数据集进行完全排序,只需要找到最大的K个元素。这种情况下,不同的算法可能有不同的效率。 先想速排序。速排序的平均时间复杂度是O(n log n),最坏情况下是O(),但实际应用中通常很。不过,如果只是找最大的十个元素,是否需要用速排序对整个数组排序呢?其实不需要,因为速排序的划分过程可以帮助找到前K大的元素。比如,可以用速选择算法,找到一个基准点,将数组分为两部分,如果基准点的位置刚好是第K大的位置,那么右边的元素就是最大的K个。这种方法的时间复杂度平均是O(n),最坏情况是O(),但可能比完全排序。不过用户可能问的是排序方法,所以可能需要考虑是否适用。 接下来是堆排序。堆排序的时间复杂度是O(n log n),但这里有个优化点。如果只需要前K个元素,可以使用一个大小为K的最小堆。具体来说,遍历数组,维护一个包含当前最大的K个元素的堆。每次新元素如果比堆顶大,就替换堆顶并调整堆。这样时间复杂度是O(n log K),对于K=10,这个log K的值很小,所以整体效率很高。而堆排序本身需要构建堆然后依次取出最大元素,但这里可能不需要完全堆排序,而是部分堆操作,可能更高效。 然后是二路归并排序,时间复杂度是O(n log n),稳定但需要额外的空间。归并排序无论数据如何分布都需要分割和合并,对于Top K问题来说,可能没有优势,因为需要完全排序后才能取出前十个,这会浪费时间和空间。所以可能不是最优选择。 插入排序的时间复杂度是O(),在数据量大的情况下效率非常低,1000个元素的话,插入排序显然不合适,应该排除。 所以综合来看,堆排序的方法,或者更准确地说,使用堆结构来维护前K个元素,可能是最优的。不过用户给出的选项是堆排序,而不是堆结构的选择,可能需要确认。如果严格按照选项中的排序方法来说,堆排序的时间复杂度是O(n log n),而速排序的平均也是O(n log n),但实际可能更,不过对于Top K问题,速选择更适合,但用户是否将速选择视为速排序的一部分? 这时候需要明确用户的问题是否需要使用完整的排序算法,还是可以使用部分排序或选择算法。用户的问题可能倾向于使用排序方法中的最优者,但可能没有意识到Top K问题的最优解不是完整排序,而是部分选择。比如,标准答案应该是使用堆的方法,即维护一个大小为K的最小堆,时间复杂度O(n log K),而如果是使用堆排序的话,可能时间复杂度更高。但选项中可能没有这个选项,用户给出的选项是堆排序,所以需要看在这四个选项中哪个更好。 另外,速排序的速选择算法可以在平均O(n)时间内找到第K大的元素,然后划分出最大的K个元素,这比堆排序的O(n log n)可能更,尤其是当K远小于n的时候,比如这里n=1000,K=10。所以速选择可能更优,但用户是否将其视为速排序的一种应用? 在这种情况下,用户可能希望知道在四个选项中,哪种排序算法作为整体排序方法时最优,但实际处理Top K问题时,最优方法可能不是完全排序,而是部分选择。所以可能需要指出,虽然堆排序作为完整排序的时间复杂度是O(n log n),但使用堆结构来维护Top K的时间复杂度是O(n log K),而速选择的平均时间复杂度是O(n)。但选项中是否有对应的算法? 用户给出的选项是速排序、堆排序、二路归并排序、插入排序。所以需要在这四个中选最优的。如果必须使用完整的排序算法,那么堆排序和速排序都是O(n log n),而归并排序同样,插入排序是O()。因此在这四个中,堆排序可能不是最优的,但题目可能希望选择堆排序,因为可以用堆结构来优化Top K问题,而其他排序方法需要完全排序。 或者,用户可能想知道在这四个排序算法中,哪个在处理这个问题时最。例如,速排序在实际中通常比堆排序和归并排序更,因为常数因子小,所以尽管都是O(n log n)速排序可能更。而归并排序需要额外的空间,而插入排序在大数据量下显然。因此,如果必须完全排序的话,速排序可能最优,但如果是Top K问题,更优的是使用堆结构或者速选择,但选项中没有这些。 这时候可能需要指出,虽然题目中的选项是四个排序方法,但实际最优解并非完全排序,而是使用堆或者速选择。但用户可能希望知道在四个选项中哪个最好,或者需要解释两者的区别。 例如,在四个选项中,如果必须用排序算法,那么速排序可能是最的,但如果是解决Top K问题,正确的方法应该是使用堆结构,即维护一个大小为K的最小堆,时间复杂度O(n log K),或者使用速选择找到第K大的元素,然后取出前K个,平均O(n)。但这两个方法可能不在选项中。 所以,用户的选项中可能希望得到的答案是堆排序,因为堆结构在处理Top K问题时更高效,但堆排序本身是排序整个数组,而使用堆结构来维护Top K并不等同于堆排序,所以这里可能存在混淆。 因此,在回答时需要澄清,如果必须从四个排序算法中选择,速排序可能更,但正确的解决方法是使用堆结构(不是堆排序)或者速选择。但根据用户提供的选项,可能应该推荐堆排序,因为其堆结构有关,但需要明确说明。 或者,可能存在误解,用户可能认为堆排序是处理Top K的最优方法,但实际并非如此,正确的做法是使用最小堆来维护Top K,时间复杂度更低。因此,可能需要指出正确的做法是使用堆的方法,而不是堆排序,但选项中可能没有,所以需要比较四个选项中的哪一个更好。 另外,当n=1000,K=10时,部分排序方法可能更优。例如,C++中的std::partial_sort就是使用堆的方法,时间复杂度是O(n log K),而如果使用速选择,然后对前K个元素排序,时间复杂度是O(n + K log K)。对于K=10,这非常高效。 但用户的问题是关于四个排序算法的选择,所以可能需要解释,在这些排序算法中,如果必须使用完整排序的话,速排序可能最,但实际最优解是部分排序或选择算法,如堆或速选择,而选项中可能没有这些,所以需要根据选项进行判断。 总结:用户的问题可能希望了解在四个排序算法中选择哪个来处理Top K问题,但正确的答案可能不在选项中,而是使用堆结构或速选择。但根据选项,可能选择堆排序,因为堆结构相关,但需要明确说明两者的区别,指出正确的做法是维护一个大小为K的堆,而不是进行完整的堆排序。或者,如果必须使用完整的排序算法,那么速排序可能更,但效率不如专门处理Top K的方法。</think>### 一、问题分析 需从 **1000个元素中找出最大的10个**,属于 **Top-K 问题**(K=10)。 关键要求:**无需完全排序所有元素**,只需定位最大的10个,因此需选择 **时间和空间效率最优** 的方法。 --- ### 二、算法对比选择 | 方法 | 时间复杂度 | 适用性分析 | |--------------|------------------|---------------------------------| | **速排序** | 平均 $O(n \log n)$,最差 $O(n^2)$ | 需完全排序,冗余操作多,效率低 | | **堆排序** | 稳定 $O(n \log n)$ | 可优化为 **部分堆构建**,更高效 | | **二路归并** | 稳定 $O(n \log n)$ | 需完全排序,额外空间 $O(n)$ | | **插入排序** | $O(n^2)$ | 仅适合小规模数据,1000元素极 | --- ### 三、最优方案:堆排序的改进策略 **核心思路**:利用 **最小堆(Min-Heap)** 维护当前最大的10个元素,仅需一次遍历: 1. 初始化一个大小为10的最小堆; 2. 遍历1000个元素: - 若元素 > 堆顶(当前第10大),替换堆顶并调整堆; - 否则跳过; 3. 最终堆中元素即为最大的10个。 **时间复杂度**: $$ O(n \log K) = 1000 \times \log 10 \approx 1000 \times 3.3 = 3300 \text{次操作} $$ 远低于完全排序的 $O(n \log n) \approx 1000 \times 10 = 10,000$ 次操作。 --- ### 四、其他方法的局限性 1. **速排序**: - 完全排序浪费资源,且最坏情况 $O(n^2)$ 不可控; - 若用 **速选择(QuickSelect)** 找第10大元素,理论平均 $O(n)$,但需额外处理前10元素排序。 2. **归并排序**: - 必须完全排序,空间复杂度高; - 无针对Top-K的优化空间。 3. **插入排序**: - 时间复杂度 $O(n^2)$,1000元素需约 $500,000$ 次操作,效率极低。 --- ### 五、结论 **最优方法**:基于堆排序思想改进的 **最小堆策略**(时间复杂度 $O(n \log K)$)。 **次优选择**:若必须使用原排序算法,优先选 **堆排序**(稳定 $O(n \log n)$),其次是速排序(平均性能好,但风险高)。 **代码示例(Python)**: ```python import heapq def find_top_k(nums, k): min_heap = [] for num in nums: if len(min_heap) < k: heapq.heappush(min_heap, num) else: if num > min_heap[0]: heapq.heappop(min_heap) heapq.heappush(min_heap, num) return min_heap # 示例:1000个随机数中找最大的10个 nums = [ ... ] # 1000个元素 top_10 = find_top_k(nums, 10) ``` --- ### 六、扩展思考 - **海量数据场景**(如10亿元素):需结合 **分治+堆**,分块处理后再合并结果; - **动态数据流**:持续用最小堆维护Top-K,时间复杂度稳定为 $O(n \log K)$。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值