标签:
线性表的应用
线性表的自然连接
计算任意两个表的简单自然连接过程讨论线性表的应用。假设有两个表A和B,分别是m1行、n1列和m2行、n2列,它们简单自然连接结果C=A*B(i==j),其中i表示表A中列号,j表示表B中的列号,C为A和B的笛卡儿积中满足指定连接条件的所有记录组,该连接条件为表A的第i列与表B的第j列相等。
如:
1 2 3 3 5
A = 2 3 3 B = 1 6
1 1 1 3 4
1 2 3 3 5
1 2 3 3 4
A*B(3==1) = 2 3 3 3 5
2 3 3 3 4
1 1 1 1 6
数据组织
由于每个表的行数不确定,为此,用单链表作为表的存储结构,每行作为一个数据结点。另外,每行中的数据个数也是不确定的,但由于提供随机查找行中的数据,所以每行的数据采用顺序存储结构,这里用长度为MaxCol的数组存储每行的数据。因此,该单链表中数据结点类型定义如下:
另外,需要指定每个表的行数和列数,为此将单链表的头结点类型定义如下:
这里的头节点带有附加信息
建立线性表
连接表算法
为了实现两个表h1和h2的简单自然连接,先要输入两个表连接的列序号f1和f2,然后扫描单链表h1,对于h1的每个结点,从头至尾扫描单链表h2,若自然连接条件成立,即h1的当前结点*p和h2的当前结点*q满足:
p->data[f1-1]==q->data[f2-1]
则在新建单链表h中添加一个新结点。
新建的单链表h也是采用尾插法建表方法创建的。
有序表
所谓有序表,是指这样的线性表,其中所有元素以递增或递减方式排列,并规定有序表中不存在元素值相同的元素。在这里仍以顺序表进行存储。
其中只有ListInsert()基本运算与前面的顺序表对应的运算有所差异,其余都是相同的。有序表的ListInsert()运算对应的算法如下:
例:设计一个算法将两个有序表合并成一个有序表
例:已知三个带头节点的单链表LA,LB和LC中的结点均依元素自小至大非递增排列(每个链表不存在数值相同的点),但可能存在3个链表中都存在的点。编写一算法做如下操作:
使LA仅留下3个表中均包含的数素元素的结点,并且没有数据值相同的结点,并释放LA中所有无用的结点。要求算法时间复杂度为O(m+n+p),m\n\p分别为3个表的长度。
一元多项式的计算(非求值)
对于一元多项式:
P=p0+p1X+…….+pnXn
在计算机中,可以用一个线性表来表示:
P = (p0, p1, …,pn)
但是对于形如
S(x) = 1 + 3x10000 – 2x20000
的多项式,上述表示方法是否合适?
一般情况下的一元稀疏多项式可写成
Pn(x) = p1xe1 + p2xe2 + ... ... + pmxem
其中:pi 是指数为ei 的项的非零系数,
0≤ e1 < e2 <... ...< em = n
可以下列线性表表示:
((p1, e1), (p2, e2), ┄, (pm,em) )
例如:
P999(x) = 7x3 - 2x12 - 8x999
可用线性表
( (7, 3), (-2, 12), (-8, 999) )
表示
因此数据可组织成:
结点的数据元素类型定义为:
其应实现的基本运算有:
建立
CreatPolyn ( &P, m )
操作结果:输入 m 项的系数和指数,
建立一元多项式 P。
销毁
DestroyPolyn ( &P )
初始条件:一元多项式 P 已存在。
操作结果:销毁一元多项式 P。
打印
PrintPolyn ( &P )
初始条件:一元多项式 P 已存在。
操作结果:打印输出一元多项式 P。
项数
PolynLength( P )
初始条件:一元多项式 P 已存在。
操作结果:返回一元多项式 P 中的项数。
相加
AddPolyn ( &Pa, &Pb )
初始条件:一元多项式 Pa 和 Pb 已存在。
操作结果:完成多项式相加运算,即:
Pa = Pa+Pb,并销毁一元多项式 Pb。
相减
SubtractPolyn ( &Pa, &Pb )
初始条件:一元多项式 Pa 和 Pb 已存在。
操作结果:完成多项式相减运算,即:
Pa = Pa-Pb,并销毁一元多项式 Pb。
约瑟夫环问题
约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些叛乱者表决说“要投降毋宁死”。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品一起投降了罗马。
约瑟夫环问题的具体描述是:设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。
解决方法:建立无头节点的循环链表(有头节点亦可)
另一种方法(数学方法)时间复杂度o(n)[转]
标签:
原文地址:http://www.cnblogs.com/xxxs/p/4453958.html