金字塔原理笔记

第一部分: 表达的逻辑


第一章 为什么要用金字塔结构

1. 在金字塔结构中,思想之间的联系方式可以是:

  • 纵向的:即任何一个层次上的思想都是对其下面一个层次上思想的总结;
  • 横向的:即多个思想因共同组成一个推理过程,而并列排在一起。

对文章阐述的思想做出疑问/回答式反映是人类的一种自然反应,没有国籍和民族的区别。人类还有一个共同的特点,即只有用某种方式将思想表达出来(说出来或者写下来),我们才能够准确的把握自己的思想。

  • 分组归类搭建金字塔
  • 找出逻辑关系,抽象概括
  • 自上而下表达,结论先行

理清表达思想的顺序,是写出条理清晰文章的重要方式,而清晰的顺序,就是先提出总结性思想,在提出被总结的具体思想。
无论读者的智商有多高,他们可利用的思维能力都是有限的。一部分思维能力用于识别和解读读到的词语,另一部分用于找出各种思想之间的关系,剩下的思维能力则用于理解所表述思想的含义。

排序算法-归并排序

算法简述

  • 归并排序,是创建在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个典型应用,且各层分治递归可以同时独立进行.
  • 归并排序可以采用递归和迭代两种方式来实现
  • 算法复杂度
    • 比较次数介于½nlgn与nlgn之间
    • 赋值操作次数是2nlgn
    • 空间复杂度为O(n)

归并排序-递归实现

算法描述

  1. 将长度为n的序列进行拆分,得到lg(n)+1级(递归栈深度)的子序列,最后一级共n个子序列,每个序列一个元素
  2. 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素
  3. 将上述序列再次递归,形成floor(n/4)个子序列,每个序列包含4个元素
  4. 重复步骤3,直到所有元素排序完毕

算法基础

分析算法

分析算法的结果意味着预测算法需要的资源。虽然我们有时主要关心像内存、通信带宽或计算机硬件这些资源,但通常我们想度量的是计算时间。一般来说,通过分析求解某个问题的几种候选算法,我们可以选出一种最有效的算法。这种分析可能指出不止一个可行的候选算法,但是在这个过程中,我们往往可以抛弃几个较差的算法。一般来说,算法需要的时间与输入的规模同步增长,所以通常把一个程序的运行时间描述成其输入规模的函数。

  • 输入规模:输入规模的最佳概念依赖于研究的问题。对于许多问题,最自然的度量是输入中的项数,有时用两个数来描述一个算法的输入规模更为合适,如基于图的算法。
  • 运行时间:一个算法在特定输入的运行时间是指执行的基本操作数或步数。其中步数,采用以下观点,执行每一行代码需要常量执行时间。

排序算法-插入排序

算法简述

  • 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
  • 插入排序算法时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
  • 插入排序算法空间复杂度为O(1),原位排序。
  • 插入排序根据不同的具体实现方式又可以分为: 直接插入排序二分插入排序2-路插入排序表插入排序
  • 折半插入排序只是减少了比较次数,移动次数并没有改变,说以算法的时间复杂度仍为O(n^2)

线性数据结构之链表

这里对单链表的一些基本操作进行了总结,更为复杂的操作再次基础上进行改进一般都可以实现,有些操作的算法并不是最优的。linkedlst.h文件包含了数据类型的定义与单链表操作的声明;linkedlist.c文件包含了单链表操作的具体实现。

相关操作:

  1. 初始化一个单链表
  2. 判断链表是否为空
  3. 确定链表中项目的个数
  4. 打印链表中的数据
  5. 在链表头节点后增加新节点
  6. 在链表尾节点后增加新节点
  7. 查找量表中的指定元素
  8. 删除元素x对应的节点
  9. 删除链表

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器