起因
前几天看了哈希表的原理与实现,理论虽然看的很明白,实际用代码实现时犯了难。不知如何下手,对于哈希表而言,常用的操作有初始化,添加,去除,查找,键值映射。如果画成图的话,就是双重链表,或者链表索引链表。
如果使用数学语言表述,并不复杂,就是一个矩阵,一个指标表示行,一个指标表示列。但是,放到程序上就不能这么写了,因为数据存储需要考虑很多实际问题,假如列的长度不一致,使用矩阵表示就会出现很多零,白白占据大量空间,这也是为何使用链表而不使用二维数组。
基本的结构确定好了,接下来需要实现具体的操作,添加键值,这种添加可以在很多位置进行,比如开头,中间,结尾,位置不一样,所需的具体实现也不一样。不过,有些操作在链表中已经定义了,直接调用就可以了。去除键值,也是一样的,对链表数据的操作,查找也差不多。于是只剩下键值映射了,映射就是一个函数,为了提高空间利用率,最好是一个满射,也就是所有的存储位置都有数据,为了提高查找效率,最好是一个单射,一个存储位置正好是一个数据,这样只需要查询一次。合起来,就是一个双射,一个数据对应一个位置。这种情形就是最理想的情形,没有冲突,只不过,一般不容易实现这种效果,所以往往需要两次查询,效率大大降低了。
以上就是理论,分析的很好,但是用一种特定语言把代码写出来,就做不到了。链表结构如何定义,初始化,赋值,相关的操作如何调用,对于所需使用的数据,如何用标识符的方式定义出来,如何调取下一个数据。
一些思考
这些知识,在理论中是看不见的,而想要实现就必须知道。很有意思,以前我想构建一个万有理论,可以解决所有的可解决问题,虽然取得了一定的成果,比如逻辑演绎系统,结构主义,抽象层级。但是与实际应用场景的结合总是无法实现,虽然相比于过去的方式,可以大大减少学习时间,但是依然有不小的学习成本。所以,就搁置了,不过,姑且也算是有些用处。
可否通过一些基本模型和假设,在常识上架构出特定专业的结构,然后将专业内部的理论视为在此结构上的二次架构。这种方法,其实也不行,是纸上谈兵,因为专业结构本身需要个人的理解实现,换一个人,可能都无法沟通,即使每个人都建立了自己对某一专业的认识,这种认识间的差异也非常大。又如何能提炼出适合所有人的通用结构呢?感觉还是挺可惜的,不过可能说明了一些道理,随知识的结构化进程,急需解决的矛盾就是个体差异性问题,这个问题非常敏感,人们将差异视为自己的本质,所以强行同化会导致很多矛盾,这个问题在短期内是无法解决的。但是,反过来,也带来了全新的道路,当一个人跨越的领域越多,对事物的理解也会越来越全面,甚至于趋向于某一个固定模式,在一些基本认识上达成共识。而在一些无关紧要的部分,则是会因具体涉及领域的不同而体现出差异性。
通用数据结构
或者说是高级数据结构,实际使用的数据的组织方式其实并不多,这些方式在课本里被反复描述。
数组,顺序存取,末尾添加删除容易,中间困难
链表,任意存取,查找费劲,添加删除容易
队,先入先出,顺序等待
栈,先入后出,运算,状态恢复
二叉树,二分化结构,查找容易,添加删除较易
图,复杂结构,体现事物固有联系性,专门化方法,都不容易
通用结构的实现,用基本结构组合。
-
数组+数组,二维数组,顺序存取,位图,空间占用大
image.png -
链表+数组,条目表,一般数组大小一致,方便统一操作
image.png -
数组+链表,毛发
image.png -
链表+链表,双重链表
image.png -
队,栈+数组,链表,控制结构,事务序列
image.png -
数组,链表+队,栈,不知道什么用,或许是并行结构
image.png
后面的其实也没太大必要写了,都是将某种结构封装,然后组织起来。这些结构没太大实际意义。人们会使用其他的词代表这种结构,比如对象,子程序,函数。所以,一般的数据结构只到二维,而且往往不包含队,栈,树,图之类的结构。这些组合结构看起来就是向量空间的直和。
元素调用
数组,
链表,
栈,a.push,a.pop
一些新的认识
之前,总想着仅靠自己的力量把题目做出来,真是太狂妄了。还是要充分的学习各种方法和套路,要有足够的积累,才能发挥出实力。而且,可以肯定的是,精通算法和数据结构的人并非把所有的程序都记在了心中,而是整理出了一套使用流程,对应于何种情况,使用何种方法,方法本身是很少的。
这一种整理方式,可以参考之前的从概念中提取知识的方法,虽然题目很多,经过几次切片整理后,就没有多少了,很多都是同类型的题目,变动一下组合方式。就像刷题一样,数学分析看似题目很多,其实就是那几个主要知识点。不过,对于程序而言,使用不同的语言,对应的表述也会有很大差异,所以,往往使用伪代码,或者流程图之类的方式表示,也算是一种中间结构。
既然如此,要迅速提高水平,就要广泛的阅读代码,而不是写代码,掌握各种逻辑和基本实现方式,这样就会容易很多。若是总认为只靠自己就能解决问题,那就会陷入不断地打击中,最后就开始逃避了。
由此想到一个问题,是何时开始,人们的脑海中就出现了必须靠自己解决问题的准则,好像是为了应付考试,在考试之中自然不会有人帮你写答案。但是,实际的生活中,这种准则非常有害,往往会合理化的区分出人的三六九等,带来无穷的纷扰。所以,竞争观念是深入人心的。这种人我分离的认识,也会是很多烦恼的来源。
最后,为什么不推荐自己独立做出题目,因为不划算,一方面看似简单的问题,往往需要苦思冥想,那些简洁精妙的解答,不知道在底下花了多少功夫,这中间的门道大得很,人们为了保持一个胜于常人的形象,也不会直说。另一方面,逻辑思维训练做的已经足够多了,继续去锻炼也没什么太大意思,关键问题在于领域转换,从编程转换到数学,逻辑之上。
问题解决范式数学表述变量对应程序代码
这个解决范式指的是常用的算法,和通常的解数学题区别很大,数学表述一般比较基本,变量对应就涉及了具体的实现代码,比如临时变量,比如数据结构中的变量,还有变量的处理。所以,欠缺的不仅是代码实现,还有这种解决范式。这就需要刷题来实现,或者多看别人的处理方法,模仿,改变,内化为自己的方法。
虽然此次尝试以失败告终,也是很有益的,通用虽然存在,只有和实际情况结合才能变得有用,可用,好用。而且,由具体上升到一般,也必然需要逐渐剥离这种实际性,不然就只能专用,而不能泛用了。这个矛盾还是很难解决啊。不过,相比于两年前,似乎有所进步,当时想要实现整体医学的概念,解剖,肌肉,骨骼,神经,器官,血管,输运,药物,将它们统一在一个框架下,实现全局的人体状态描述。目标实在是太大了,遇到的一个突出问题就是,药物在血管中的流动与分配,这个问题非常困难,估计是生物流体力学的内容,研究的人估计都没多少,除此之外,还有许许多多的问题,现在依然觉得不可能实现,就当作科学幻想了。这次尝试,虽然失败,但是有成功的可能性。毕竟依赖的是逻辑,容易整理,生物,医学之类的感觉都是经验和玄学,很多东西解释不通,很多理论不断的被推翻重建,空有头脑,无济于事。研究复杂系统的科学,如人体,心理,社会,经济,都非常不靠谱。经验和莫名其妙的规律很有效,基于各种假设组织出来的数学模型往往错的很离谱,只能当作玩具。
网友评论