数据结构与算法:前言

数据结构和算法是计算机领域的基础,其思想运用在计算机科学的各个方面。这么重要的内容,其书籍和课程也汗牛充犊、数不胜数,书籍比如经典的《算法导论》、《算法》、《数据结构与算法:X 语言描述》等等;课程有 MIT、斯坦福、清华、北大、浙大等优秀精品。那作为一个非计算机专业的小白,又在这里能做些什么呢?此事说来也简单,主要是源自与朋友一起学习的约定,我们一致认为应该用输出来判断是否学过,那这个输出自然就是教程了。

当然,这个只是表面的、直接的原因,还有一些更深层次的原因。首先,由于我自己是完全自学 CS,所以默默刷了不少课程,也都认认真真做了笔记(主要记录课程重点和自己的想法),但是总感觉对工作没起到什么明显的作用,或者说总感觉学完了后并不能把所学的东西很快运用到工作中。这一方面是因为学到的东西不一定马上就正好能用(比如我学了 C 语言,但工作中可能暂时不用写 C 语言代码);另一方面是在学习过程中主观上没有把知识关联起来,学到的都是一个一个的点(比如 C 语言就学习课程教授有关 C 语言的东西)。

因此我觉得需要重新认真审视自己的学习过程:应该主动地去将某门课程与已知的知识点甚至思想串联起来、应该主动地寻找已学到知识点的应用场景(不是只做个作业)。这种情况下,记录就显得非常重要了,因为我们不再是单点突破,而是想要通过一个点带动一个面,任何一门单独的课程都不能够满足我们的需要,所以要写教程,这是第一个深层次的原因。如果说第一个深层次的原因是 “学”,那么另一个更深层次的原因就是 “教”,我是个经济学专业硕士毕业 HR 岗位工作 5.5 年然后转行的 NLP 工程师,认识很多同样是转行的小伙伴,也认识很多想转行但是担心自己 ¥%……&*(此处省略一万种原因),我希望自己的经历能够帮助到一些伙伴,让他们能少走一些弯路;此外,这几天正在阅读费曼的相对论讲义,对他关于 “教” 的理念非常赞同和倾慕,他想让大一大二的学生能够在已掌握内容和对已掌握内容进行演绎的基础上能够学到他要求学生们能够学到的内容。所以,我们需要明确目的,也就是我们为什么要学习数据结构和算法?以及我们到底要从中学到什么?我知道每个人可能都有自己的答案,当然也有不少人可能没想过,不过在这里我觉得我至少可以明确一下。这个目的就是:运用最少的基础知识(熟悉基本的数学和一门编程语言)学习数据结构和算法,理解计算机的思想、甚至解决问题的思想。从中可以学习到:每种数据结构和算法适用于什么问题,如何实现,核心和本质是什么,是否可以迁移到其他领域等等。

丰满的理想谈完了,我需要特别申明一下骨感的现实:我不光是非 CS 专业,还没有完完整整学过任何一门数据结构或算法的课程(感觉有点托大……),说心里话我自己是底气不足的,非常不足,我甚至已经有放弃的打算了,因为我甚至完全不知道应该如何开始,但我已经准备开始了……那,就这样硬上吧,就当是自己学习的一次新的尝试了。By The Way,这里没有提纲或者目录之类的,因为我也刚开始学,不管了,干着看吧。

西蒙《人工科学》读书笔记

目录

More

NG CNN 笔记

说明:来自卷积神经网络 - 网易云课堂的关键点记录,用来随时查阅,多图(88张)。课程真的很好;)

目录

More

浙大翁恺老师《C 语言程序设计进阶》笔记

说明:本文档为浙大翁恺老师《C 语言程序设计进阶》课程内容笔记,主要记录学习过程中的一些重要或自己不懂的知识点,方便随时反复查看,内容不一定适合其他人。

如果想看 C 语言基础版的,可以移步:浙大翁恺老师《程序设计入门——C语言》笔记 | Yam

小感想:自从大学上过这门课后就再没碰过了。这次学完两门课,写了一些代码,才慢慢有了一些感觉。这种感觉不光是对 C,更是对写代码和深入探索未知的过程。虽然有时候也会情绪低落、状态低迷,什么都不想做,但整体还是蛮开心的,也从没有想过放弃。希望能在这条路上与更多的小伙伴同行。

目录

Week1:指针与字符串

指针的使用

指针的应用场景1

  • 交换两个变量的值

    1
    2
    3
    4
    5
    6
    void swap(int *pa, int *pb)
    {
    int t = *pa;
    *pa = *pb;
    *pb = t;
    }
  • 函数返回多个值,某些值就只能通过指针返回

    • 传入的参数实际上是需要保存带回的结果的变量

More

NLP 与 AI

NLP 很难,但如果用一句话概括这种难度,应该是 “语义理解”,也就是让机器理解自然语言。“理解” 的意思是它明白那句话是什么意思,这个意思包括字面表现出来的意思和字面背后说话人实际想要表达的意思。比较上层的应用自不必说,即便是最底层的分词、词性标注、句法分析等任务也是同样涵盖在内。“分词” 是汉语以及其他一些没有对词语进行分割的语言才需要做的,而汉语相比其他语言除了分词上的问题外,还有大量汉语本身的特殊问题。仅拿文字处理举例,汉语中看似完全相反的话可能表达的是一个意思,比如 2018(CCF-GAIR)NLP 专场云孚科技张文斌分享的几个例子:了得 VS 了不得,我可想死你了 VS 你可想死我了;汉语的抽象程度相对更高,往往几个字就表达了很多东西,这点可以通过书籍的薄厚程度就能感知一二;汉语最小单元汉字数量非常多,相比英语熵要大很多。再说分词,之前看过一篇文章讲到分词,提到两个观点:第一,分词的主要目的是消除歧义;第二,汉语的不分词是导致其在世界范围内流传不广、难学的主要因素之一。我对这两个观点都比较认同,不分词从认知的角度来说的确需要更多的注意力,其实我们阅读过程中大脑后台已经做了分词,所以文字的不分词有点感觉是浪费人的精力。当然其他如词性标注、实体识别、句法、语义角色等任务也有类似的问题。

More

浙大翁恺老师《程序设计入门——C语言》笔记

说明:本文档为浙大翁恺老师《程序设计入门——C语言》课程内容笔记,主要记录学习过程中的一些重要或自己不懂的知识点,内容不一定适合其他人。

翁老师讲课真的很通俗易懂,这个课程作为入门课难度适中,推荐需要学习 C 语言的同学从这门课开始。

目录

  1. 程序设计与 C 语言
    1.1 计算机和编程语言
    1.2 C 语言
    1.3 第一个程序
  2. 计算
    2.1 变量
    2.2 数据类型
    2.3 表达式
  3. 判断与循环
    3.1 判断
    3.2 循环
  4. 进一步的判断与循环
    4.1 逻辑类型和运算
    4.2 级联和嵌套的判断
    4.3 多路分支
    4.4 循环的例子
    4.5 判断和循环常见的错误
  5. 循环控制
    5.1 循环控制
    5.2 多重循环
    5.3 循环应用
  6. 数组与函数
    6.1 数组
    6.2 函数的定义与使用
    6.3 函数的参数和变量
    6.4 二维数组
  7. 数组运算
    7.1 数组运算
    7.2 搜索
    7.3 排序初步
  8. 指针与字符串
    8.1 指针
    8.2 字符类型
    8.3 字符串
    8.4 字符串计算

期中测验
期末考试
附录

1. 程序设计与 C 语言

1.1 计算机和编程语言

  • 人:What to do;计算:How to do
  • 计算机做的所有事情都是计算,计算的步骤就是算法。
  • 程序的执行
    • 解释
    • 编译

1.2 C 语言

  • 历史

    • FORTRAN - BCPL - B - C
    • 1973 年 3 月:第三版 Unix 上出现了 C 语言编译器
    • 1973 年 11 月:第四版 Unix 完全用 C 语言重写
  • 版本

    • 经典 C

    • 1989 ANSI C

    • 1990 ISO 接受了 ANSI 的标准——C89

    • 1995 1999 两次更新:C95 C99

  • 应用

    • 操作系统
    • 嵌入式系统
    • 驱动程序
    • 底层驱动:图形引擎、图像处理、声音效果等

1.3 第一个程序

More

线性代数的本质笔记

说明:来自:3Blue1Brown,关键点的记录,用来当笔记随时查阅和再学习的。多图。
感谢作者的付出,真心很赞。

吐槽一下:B 站真的不是看学术视频的好地方,乱七八糟的弹幕每次要屏蔽,连续暂停会卡顿,快进快退会卡顿。

后面六个视频要多看几遍。

目录

序言

几何水平上的理解能让你判断出解决特定问题需要用什么样的工具,感受到他们为什么有用,以及如何解读最终结果。数值水平上的理解则能让你顺利应用这些工具。

向量究竟是什么?

将向量看作运动(就像在数轴上一样)。

看作空间中的箭头,看作数字列表。

线性组合、张成的空间与基

将向量看作单位向量的缩放(缩放向量并相加):选择标量,对向量分别进行缩放,然后把结果相加。

如果选择不同的基向量会怎样?

它同样允许我们在一对数和二维向量之间自由转化。但这种变换关系与之前用 i 帽和 j 帽的变换关系完全不同。

每当我们用数字描述向量时,它都依赖于我们正在使用的基。

但当共线时,它们张成的空间就是终点落在一条直线上的向量的集合。

两个向量张成的空间实际上是问仅通过向量加法与向量数乘这两种基础运算,能获得的所有可能向量的集合是什么?

Trick:单个向量看作箭头;多个向量看作点(否则会太拥挤)。所以对大部分二维向量对来说,它们张成的空间是整个无限大的二维平面;但如果共线,它们张成的空间就是一条直线。

三维与二维类似:当你缩放第三个向量时,它将前两个向量张成的平面沿它的方向来回异动,从而扫过整个空间。另一种思考方式是:利用自由变化的三个标量,从而得到空间中所有的三维向量。

一组向量中如果有至少一个是多余的(没有对张成空间做出任何贡献,如二维的共线、三维的共面等),也就是移除那个向量而不减小张成的空间,此时它们是 “线性相关” 的。另一种表述是,其中一个向量可以表示为其他向量的线性组合,因为这个向量已经落在其他向量张成的空间之中。

另一方面,如果所有向量都给张成的空间增加了新的维度,它们就被称为 “线性无关” 的。

空间的一组基的严格定义:张成该空间的一个线性无关向量的集合。

More