加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

避免人工智能项目失败的3种方式

发布时间:2021-01-31 10:05:50 所属栏目:外闻 来源:互联网
导读:删除上:非第0个位置删除区别不大,不带头结点的删除第0号位置之后需要重新改变head头的指向。 头部删除(带头结点):带头结点的删除和普通删除一样。直接head.next=head.next.next,这样head.next就直接指向第二个元素了。第一个就被删除了 头部删除(不带头

删除上:非第0个位置删除区别不大,不带头结点的删除第0号位置之后需要重新改变head头的指向。

头部删除(带头结点):带头结点的删除和普通删除一样。直接head.next=head.next.next,这样head.next就直接指向第二个元素了。第一个就被删除了

头部删除(不带头结点):不带头结点的第一个结点(head)就存储有效数据。不带头结点删除也很简单,直接将head指向链表中第二个node结点就行了。即:head=head.next
 

带头结点链表VS不带头结点链表

有很多人会不清楚带头结点和不带头结点链表的区别,甚至搞不懂什么是带头结点和不带头结点,我给大家阐述一下:

带头结点:head指针始终指向一个结点,这个结点不存储有效值仅仅起到一个标识作用(相当于班主任带学生)

不带头结点:head指针始终指向第一个有效结点,这个结点储存有效数值。

那么带头结点和不带头结点的链表有啥区别呢?

查找上:无大区别,带头结点需要多找一次。

插入上:非第0个位置插入区别不大,不带头结点的插入第0号位置之后需要重新改变head头的指向。
 

链表

学习c/c++的时候链表应该是很多人感觉很绕的东西,这个很大原因可能因为指针,Java虽然不直接使用指针但是我们也要理解指针的原理和运用。链表不同于顺序表(数组)它的结构像一条链一样链接成一个线性结构,而链表中每一个结点都存在不同的地址中,链表你可以理解为它存储了指向结点(区域)的地址,能够通过这个指针找到对应结点。

对于物理存储结构,地址之间的联系是无法更改的,相邻就是相邻。但对于链式存储,下一位的地址是上一个主动记录的,可以进行更改。这就好比亲兄弟从出生就是同姓兄弟,而我们在成长途中最好的朋友可能会由于阶段性发生一些变化!

就如西天取经的唐僧、悟空、八戒、沙和尚。他们本无联系,但结拜为师徒兄弟,你问悟空他的师父他会立马想到唐僧,因为五指山下的约定。
 

可以看得出如果顺序表很长,在靠前的地方如果插入效率比较低(插入时间复杂度为O(n)),如果频繁的插入那么复杂度挺高的。

删除操作

同理,删除也是非常占用资源的。原理和插入类似,删除index位置的操作就是从index+1开始向后依次将数据赋值到前面位置上,具体可以看这张图:
 

请记住这个图,后续我们讲到内存管理的时候再把进程和内存结合起来看,到时候你就会站在上帝视角对内核有了指点江山的感觉。

设置CPU指令寄存器

如上两步建立了虚拟地址空间和物理内存、磁盘的映射关系,现在就要准备运行此程序了。运行的第一条指令地址在哪?在ELF头部中。将CPU指令寄存器的值设置为第一条指令地址即可。

执行,触发缺页中断

想想CPU在从入口地址取指令时会发生什么。假设入口地址指向.text段首,如图所示为0x8049000;CPU以此虚拟地址查找页表发现该页尚未装载,触发缺页中断。此时操作系统接管,从之前建立的虚拟地址空间与磁盘的映射关系中找到此页在磁盘中的地址;再从此地址读取页,加载到物理内存,缺页中断完毕。CPU重新从入口地址取指令,此时由页表得到物理地址,从内存中得到对应的指令,交给CPU。

随着进程的执行,缺页中断不断出现,磁盘中的可执行文件也逐渐加载到内存中。

总结

如上便是简单的可执行文件的装载过程,最需要强调的一点是,可执行文件的数据是 按需 加载到物理内存的,缺页中断驱动着进程的执行。

 

(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读