2021/11/15
今日起,学习数据结构与算法分析-C语言描述一书,此书作者为马克·艾伦·维斯(Mark Allen Weiss),由于个人水平有限,只能以类似于句读的方式对书中内容进行分析。之前,在下从未进行过有关类似数据结构与算法的系统学习。若在学习过程中,吾未能坚持,中途放弃,则希望后学引以为戒。切莫夸下海口,可尽早改行以免耽误终身。至于我,则会在试错和试探自己毅力的道路上继续前行,为各位预备改行的同僚打上一剂强心针。在此,以我面前的台灯和水杯作为见证。
----------------------分割线----------------------------以下为笔记内容-------------------------------------------------
本人认真阅读了出版者的话,对其中的相关内容进行了必要的思考,对其中的一些内容也有一些自己的思考。下面我将以段落的方式对其中的内容进行分析。
第一段
关键字:文艺复兴 自然科学 学术 美国信息技术
关键含义:其实意思比较浅显,对此我就不对内容进行详细分析了,这段主要告诉各位,世界上信息技术最好的是美国,作者用了独领风骚一词来形容。既然美国在这方面比较优秀,肯定有不少Classic教材,这第一段为后面详述翻译这一伟大的事业做了铺垫。
第二段
关键字:全球信息化 计算机产业 接轨
关键含义:此段核心概念为接轨,与国际接轨,可以看出作者的用心良苦。不过,仍旧有不少学校不愿意接轨。而且还要以一般的教学水平作为基础进行建轨,实在是勇气可嘉。令人敬佩。
剩余段落
剩余段落主要用来论述此套丛书的优秀与为什么值得一买和值得一看。内容简单,便不在赘述。
不知不觉就到了译者序,必须感谢译者,为我们这些英语水平一般,对原著只能瞻仰的学生提供学习的机会。熟话说,读一本好的书就是和大师对话,而译者就是我们和大师的桥梁。所以,这里以我的英语水平实在是没有资格对本书的翻译进行评价,只能报以感谢。在此感谢冯先生的工作。
主要内容
译者在序言中对本书的内容进行了一个简要的概括。本书主要围绕数据结构和算法分析来进行书写。我觉得本书的特点恰恰在于算法分析,对数据结构的实现进行算法分析,即给出数学上的直观,对于我们理解数据结构很是有帮助,但是学起来也不容易,这也是本书的难点所在、
值得注意的是,译者提到了本书涉及到的代码可以从互联网中下载到,但是遗憾的是我并没有在中译本中找到下载的地址。为此我决定去英文版中寻找一下。(饿了,吃饭)
网址并未找到,找到了一本习题解答。阿里云盘
我用阿里云盘分享了「Mark Allen Weiss - Algor...ley) - libgen.lc.pdf」,你可以不限速下载
复制这段内容打开「阿里云盘」App 即可获取
链接:https://www.aliyundrive.com/s/R53Au4rHxX6
前言主要分为目的,方法,内容概述等方面
作者在目的中告诉我们算法分析在当今社会的重要性,并嘱咐我们要多做练习。剩下的内容主要是说起来简单做起来难的东西,在此不做分析。
在第一章中的主要内容是书的目的,离散数学和程序设计。离散数学之前本人并未接触过,作者纯粹是为难人,为了更好的贯彻落实本书的学习思想,我决定开始学习离散数学。
引论有三个重点,即运行性能的重要性,本书中涉及到的数学知识,还有递归。
作者上来便抛出一个问题,即有N个数,确定其第k个最大者。作者将类似问题称为选择问题。
对于两种思路,明显思路二效率更高。下面我将对两种思路进行分别实现。
思路一
这里我会用冒泡排序法进行递减排序,为了保证解决的专业性,我将参考一些书籍对冒泡排序进行介绍。
Bubble Sort:冒泡排序,Bubble为气泡的意思。
#include
#include
typedef int Item;
#define key(A) (A)
#define less(A, B) (key(A) < key(B))
#define exch(A, B) { Item t = A; A = B; B = t; }
#define compexch(A, B) if (less(B, A)) exch(A, B)
void bubble(Item a[], int l, int r)
{
int i, j;
for (i = l; i < r; i++)
for (j = r; j > i; j--)
compexch(a[j-1], a[j]);
}
int main()
{
int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
bubble(a, 0, 9);
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
}
代码解释:在这段程序中,l为0到r - 1的任意整数。l不等于r的原因是最后一个元素不需要排序了,因为r-1个元素都排好的情况下,最后一个肯定排好了。
此程序测试已经通过,可以直接复制。既然排序完成,那么取第k大的数字肯定也是不成问题了,在此就不赘述了,可将程序改为降序,容易取一些。直接把compexch中的less参数顺序一改就行。
时间复杂度:理想状态不需要排序,则为N,即遍历一次,最不理想的状态,都需要排序,则为N^2,平均复杂度也是一样。
思路二
思路二实现的比较粗糙。凑活看把,欢迎批评指正。
#include
#include
typedef int Item;
#define key(A) (A)
#define less(A, B) (key(A) < key(B))
#define exch(A, B) { Item t = A; A = B; B = t; }
#define compexch(A, B) if (less(A, B)) exch(A, B)
void bubble(Item a[], int l, int r)
{
int i, j;
for (i = l; i < r; i++)
for (j = r; j > i; j--)
compexch(a[j-1], a[j]);
}
void sort(Item b[], int num, int k)
{
/* 此函数用来将剩余的元素放入数组并排序 */
b[k] = num;
bubble(b, 0, k);
}
Item select(Item a[], Item b[], int k, int aLen)
{
for (int i = 0; i < k; i++)
{
b[i] = a[i];
}
bubble(b, 0, k - 1);
for (int i = k; i < aLen; i++)
{
if (a[i] < b[i - 1])
{
continue;
}
else
{
sort(b, a[i], k);
}
}
return b[k - 1];
}
int main()
{
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int b[10] = { 0 };
int k = 0;
printf("请输入要选择第几大的数:");
scanf_s("%d", &k);
Item num = select(a, b, k, 10);
printf("第%d大的数为:%d", k, num);
}
作者接着说这两种方法如果数据量巨大的话,执行起来很费时间,并且说第7章有一个算法,只需要1秒左右就可以给出解,很是期待。
之后就是第二个问题了,第二个问题是一个字谜问题,第二个问题作者说编码很简单,但是对我这种菜鸟来说属实有些难度,上一个问题的思路二就已经使我懵逼了。所以这个问题今天暂时不做,以后有时间再回来。