选择特殊符号
选择搜索类型
请输入搜索
并行排序算法,是计算机并行计算能力大大发展之后,为了提高排序效率而提出的算法。
模拟快速排序
二叉树上模拟快速排序
串行算法简介:快速排序是一种较为高效的排序算法,它通过不断的划分待排序列为两段,使得前一段总小于或等于某个数,而后一段总大于某个数,这样每次划分就能确定一个数的最终位置。一般情况下,如果每次划分的两个子列大致等长,那么它的时间复杂度是。
在PRAM-CRCW计算模型上利用二叉树网络模拟快速排序
由快速排序的过程,我们可以看到,快速排序实际上就是在构造一棵二叉树,让划分主元位于根节点,使得左子节点小于或等于根而右子节点大于根,最后对整棵二叉树进行一次中序遍历,便可以得到最后排好序的数列。
我们可以选n个处理器分别保存待排序数组A的n个元素,处理器Pi对应一个变量Xi用于存放主元元素的处理器号,以及两个变量L,R分别存放其左右儿子。开始时,每一个处理器都试图往变量root中写入它的处理器号,若果我们使用PRAM-CRCW计算模型,那么就只有一个能够写入root,接着root被复制给每一个处理器的Xi。然后对于每个处理器Pi(除去被原为主元的那个外),判断主元A(root)的值与A(Xi)的值的大小,从而确定把A(Xi)放入编号为Xi(注意不是编号为i)的处理器的L变量还是R变量里。还是,同样的,由于并发操作的互斥性,只有一个只能被最终写入,他们就作为下次划分的主元。算法继续进行直到n个主元被选完为止。
时间复杂度分析:由于一层节点的构造时间是Θ(1),所以算法的时间复杂度是Θ(logn)
超立方体上模拟快速排序
超立方体网络是基于超立方体连接构建的网络。网络中以格雷码对各顶点编号。在下面的描述中,设顶点数p= 2,待排序元素共有n个。
超立方体上的快速排序是这样进行的:首先我们将n个元素分配到p个处理器上,为了使问题讨论简单化,假设n是p的整数倍,那么每个顶点将会分到个元素。然后随机选一个主元,各个处理器将每个顶点中的元素按与主元的比较结果分为两部份。这个算法的关键点在这里,对每一个处理器(顶点)在进行第i次划分时,将大于主元的部分都送到超立方体的一个d-i维自立方体中,而将小于主元的部分送到另一个d-i位的子立方体中,这样就模拟了快速排序中的划分算法。子立方体可以这样选择:在第i次划分中判断第i位是0还是1。划分算法到处理完所有1维子立方体后结束。接下来对每个顶点中的元素调用串行算法进行局部排序,最后对整个立方体进行一次遍历便可得到排好序的元素。
PSRS算法
Viliant归并算法
对数划分
击【分部整理】,会显示下方窗口,如图一: 钩选分部规则后点击“执行分部整理”即可。 点击【分部整理】,会显示下方窗口,如图二: 点击“执行子目排序”即可
使用08定额,建筑与装饰最好分开(分两个预算)做,就不会出现借用定额的代号了,直接点分部整理即可排序,如果不想分为两个预算,装饰部分可以按鼠标右键插入分部输入编号、分部名称,然后将该分部的子目用上下移...
你是说的定义构件中的构件排序吧,具体子类型是什么也搞不清,但排序最好是选择【按子类型和名称】排序最适当,我试过其它排序,混乱、不好使。
第8章排序介绍
第 8 章 排序 1.选择题 ( 1)从未排序序列中依次取出元素与已排序序列中的元素进行比较, 将其放入已排序序 列的正确位置上的方法,这种排序方法称为( )。 A.归并排序 B.冒泡排序 C.插入排序 D.选择排序 答案: C ( 2)从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方 法,称为( )。 A.归并排序 B.冒泡排序 C.插入排序 D.选择排序 答案: D ( 3)对 n 个不同的关键字由小到大进行冒泡排序,在下列( )情况下比较的次数最 多。 A.从小到大排列好的 B.从大到小排列好的 C.元素无序 D.元素基本有序 答案: B 解释:对关键字进行冒泡排序,关键字逆序时比较次数最多。 ( 4)对 n 个不同的排序码进行冒泡排序, 在元素无序的情况下比较的次数最多为 ( )。 A. n+1 B. n C. n-1 D. n(n-1)/2 答案:
第8章排序总结
第 8 章 排序 1.选择题 ( 1)从未排序序列中依次取出元素与已排序序列中的元素进行比较, 将其放入已排序序 列的正确位置上的方法,这种排序方法称为( )。 A.归并排序 B.冒泡排序 C.插入排序 D.选择排序 答案: C ( 2)从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方 法,称为( )。 A.归并排序 B.冒泡排序 C.插入排序 D.选择排序 答案: D ( 3)对 n 个不同的关键字由小到大进行冒泡排序,在下列( )情况下比较的次数最 多。 A.从小到大排列好的 B.从大到小排列好的 C.元素无序 D.元素基本有序 答案: B 解释:对关键字进行冒泡排序,关键字逆序时比较次数最多。 ( 4)对 n 个不同的排序码进行冒泡排序, 在元素无序的情况下比较的次数最多为 ( )。 A. n+1 B. n C. n-1 D. n(n-1)/2 答案:
二叉排序树(Binary Sort Tree:BST)
1、二叉排序树的定义
二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:
①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
③左、右子树本身又各是一棵二叉排序树。
上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。
2、二叉排序树的特点
由BST性质可得:
(1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。
(2) 二叉排序树中,各结点关键字是惟一的。
注意:
实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"小于等于",或将BST性质(2)里的"大于"改为"大于等于",甚至可同时修改这两个性质。
(3) 按中序遍历该树所得到的中序序列是一个递增有序序列。
【例】下图所示的两棵树均是二叉排序树,它们的中序序列均为有序序列:2,3,4,5,7,8。
3、二叉排序树的存储结构
typedef int KeyType; //假定关键字类型为整数
typedef struct node { //结点类型
KeyType key; //关键字项
InfoType otherinfo; //其它数据域,InfoType视应用情况而定,下面不处理它
struct node *lchild,*rchild,*parent; //左右孩子指针
} BSTNode;
typedef BSTNode *BSTree; //BSTree是二叉排序树的类型
二叉排序树的基本操作(pascal):
1.中序遍历所有元素
procedure tree_walk(x:longint);
begin
if x<>0 then
begin
tree_walk(left[x]);
write(key[x]);
tree_walk(right[x]);
end;
2.查找给定的元素
function tree_search(x,k:longint):longint;
begin
if (x=0) or (k=key[x]) then exit(x);
if k end; 非递归版本 function tree_search(x,k:longint):longint; begin while (x<>0) and (k<>key[x]) do begin if k end; exit(x); end; 3.查找最小元素 function tree_minimum(x:longint):longint; begin while left[x]<>0 do x:=left[x]; exit(x); end; 查找最大元素 function tree_maximum(x:longint):longint; begin while right[x]<>0 do x:=right[x]; exit(x); end; 4. 求后继 function tree_successor(x:longint):longint; var y:longint; begin if right[x]<>0 then exit(tree_minimum(right[x]));//若右子树不空,则返回右子树中的最小值 y:=p[x];//若右子树为空,则后继y为x的最低祖先节点,且y的左儿子也是x的祖先 while (y<>0) and (x=right[y]) do begin x:=y; y:=p[y]; end; exit(y);//注意,若y为0,则x无后继 end; //注意,函数返回值为节点编号,并不是节点本身的值 5.插入 procedure tree_insert(z:longint);//注意z为节点编号,并非树中的值 var x,y:longint; begin y:=0; x:=root; while x<>0 do//查找z的父节点,y记录 begin y:=x; if key[z] end; p[x]:=y; if y=0 then root:=z//若z为根节点 else begin if key[z] end; end; 6.删除 删除操作是最麻烦的,分3种情况: (1)若z无子树,则就删除z节点,更新p[z]的值为空 (2)若z有一个子树,删除z节点,更新p[z]的值为z的儿子节点,更新left[p[z]] 或 right[p[z]] (3)若z有两棵子树,先找到z的后继y(后继节点无左子树,可证),删除y节点,更新p[y]与left[p[y]] 或 right[p[y]],最后用节点y的数据覆盖z节点 procedure tree_delete(z:longint); var x,y:longint; begin if (left[z]=0) or (right[z]=0) then y:=z else y:=tree_successor(z); if left[y]<>0 then x:=left[y] else x:=right[y]; if x<>0 then p[x]:=p[y]; if p[y]=0 then root:=x else begin if y=left[p[y]] then left[p[y]]:=x else right[p[y]]:=x; end; if z<>y then key[z]:=key[y]; end; 7.查找数中第k大元素 需要对每个节点新开一个域v[x],记录该节点的有多少子节点, 查找时分三种情况: (1)k=v[left[x]] 1 则当前x节点为所求 (2)k<=v[left[x]] 则在左子树中继续查找 (3)k>v[left[x]] 1 则在右子树中继续查找,k更新为k-left[x]-1; function find(x,k:longint):longint; begin if v[left[x]] 1=k then exit(key[k]) else if v[left[x]]>=k then exit(find(left[x],k)) else exit(find(right[x],k-v[left[x]]-1)); end;
所谓指纹排序,就是指依靠组合数学中的排列组合概念,从多枚至十枚手指指纹中取出随机几枚指纹进行排列组合的一种排序方式。
每个人的指纹排序理论上自带100亿种密码,几乎无法破解。且组合的项目识别数据,可以轻松识别上百亿人的不同特征,轻松满足对于识别基数大的需求。对比人脸识别数据分析 ,扫脸识别 是1个识别数据,指纹排序是10个识别数据的排列组合。指纹识别 的主要难点在于,识别精度的设置。精度设置高,指纹识别要求高,不易于识别。精度设置低,对于识别基数大,相似识别数据太多,很难精准识别。