在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
什么是栈?
[1]栈的英文名为Stack
[2]栈是一个先入后出(FILO-Firest In Last Out)的有序列表
[3]栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底。
[4]根据栈的定义可知,最先放入栈的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
Josephu(约瑟夫、约瑟夫环)问题:
设编号为1,2,…,n的n个人围坐一圈,约定的编号为k(1<=k<=n)的人从1开始报数,数到的那个人又出列,依此类推,知道所有人出列为止,由此产生一个出队编号的序列。
用一个不带头节点的循环链表来处理Josepho问题:
先构成一个有n个节点的单循环链表,然后由k节点起从1开始计数,计到m时,对应节点从链表中删除,直到最后一个节点从链表中删除算法结束。
在学习单向链表的时候,使用带head头的双向链表实现-水浒英雄排行榜管理单项向链表的缺点分析:
[1]单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。
[2]单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面单链表删除节点时,总是找到temp,temp是代删除节点的前一个节点。
分析 双向链表的遍历,添加,修改,删除的操作思路==》代码实现
[1]遍历方式和单链表一样,只是可以向前,也可以向后
[2]添加(默认添加到双向链表的最后这个节点)
(1)先找到双向链表的最后这个节点
(2)temp.next=newHeroNode(使最后这个节点直接指向新的节点)
(3)newHeroNode.pre=temp(使新添加进来的节点的pre指向上一个节点)
[3]修改思路和原理和单向链表一样
[4]删除
(1)因为是双向链表,因此,可以自我删除某个节点,而不需要想单链表一样找到前一个节点才能删除
(2)直接找到要删除的节点,比如temp
(3)temp.pre.next=temp.next(要删除节点的上一个节点指向的下一个节点为要删除节点的下一个节点)
(4)temp.next.pre=temp.pre(要删除节点的下一个节点指向的上一个节点为要删除节点的上一个节点)
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作(先入先出原则),和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。