Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >比较所有元素的并行排序算法

比较所有元素的并行排序算法
EN

Software Engineering用户
提问于 2017-09-30 12:05:20
回答 2查看 413关注 0票数 3

我正在实现一种算法

  1. 并行排序元素(这将在GPU上完成,但这并不重要)
  2. 为每一对元素计算一个比较度量。此比较指标与排序中使用的标准相同。

我最初的计划是在步骤1中使用双离子排序,但我不认为bitonic排序会比较每一对元素。另外,首先执行双离子排序,然后计算每一对元素的度量似乎有点效率低下,因为在第二步中将重复计算在双离子排序期间计算的所有比较。

我想还有第三种选择。我对所执行的计算进行排序(注意到所执行的计算),然后计算其余的比较,但我担心跟踪未计算的比较的开销。

更新

似乎还需要一些额外的信息。我的元素实际上是整数n元组,有些元素既不大也不小。见所以在几个月前发帖。在这种情况下,一个稳定的排序算法将保持两个n元组的顺序,它们既不大于也不小于彼此。

EN

回答 2

Software Engineering用户

发布于 2017-09-30 22:39:18

如果比较度量是布尔值(如注释中所示),则有两种可能性。

  1. 度量是传递的(如果comp(A, B)生成true,而comp(B, C)生成true,那么comp(A, C)也必须生成true)。在这种情况下,对任意两个随机元素的比较度量几乎都是从这些元素在排序序列中结束的位置得到的。唯一的复杂因素可能来自应该被视为平等的要素。
  2. 该度量不是传递的(如果comp(A, B)生成true,而comp(B, C)生成true,那么根据定义,comp(A, C)不会产生true)。在这种情况下,度量实际上不适合对元素进行排序,因为它没有正确地定义元素的顺序。
票数 5
EN

Software Engineering用户

发布于 2017-10-05 14:11:12

我正在实现一个需要并行实现排序和综合集比较的算法

不,您需要做的是先以串行方式实现,然后才能知道如何将其转换为并行。你不会用并行开发的算法来启动大门,而不是先做一个串行的算法。

你之所以不以平行方式开始,是因为列出了很多原因,但我会告诉你一些最重要的原因:

  • 你不知道你的程序是否真的会并行地翻译,除非你真的先用串行方式写你的程序
  • 你不知道你的程序是否会执行得更好/任何部分实际上会在并行的情况下表现得更好,而不知道你的程序是否会先用串行方式编写。
  • 如果没有一个真正以串行方式工作的程序,你就无法很好地测试你的程序。

一般来说,如果你没有先按顺序实现你的程序,那么就会有太多的问题,所以,不要跳过它,并且假设所有的事情都会并行的更好,它很可能不会。

(这将在GPU上完成,但这并不重要)

是的,是的,这很重要。CPU并行具有与GPU并行完全不同的边界,线程是完全独立的,如果一个线程碰巧碰到发散指令,则不会序列化您的程序。

另一方面,如果您正在处理相同的任务,则通常需要复制数据以供CPU共享,而且在DDRN中,与GDDRN不同,在DDRN中实际上不能并行访问ram。与GPU不同的是,您不能承担O(N)任务,它们可以被平均分配,而是必须承担O(N/(小常数))(这在GPU上也不是一个有效的假设,但这是处理数据时必须具备的一种想法,因为它看起来更像O(N/20,000))。

简而言之,CPU并行操作可以很好地处理多指令、多数据(MIMD)任务,

GPU将很好地处理单指令多数据(SIMD)任务。

您的问题可能比另一种架构更好,或者在其中一种架构中不能工作/放弃速度(因为CPU上的上下文切换,或者GPU中的隐式序列化)。

我最初的计划是在第一步中使用bitonic排序,但我不认为bitonic排序会比较每一对元素。另外,首先执行双离子排序,然后计算每一对元素的度量似乎有点效率低下,因为在第二步中将重复计算在双离子排序期间计算的所有比较。

Bitonic排序的串行运行时复杂度为O(n log^2(n)),这是必须进行的比较次数,并行地,运行时为O(log^2(n)),即对每个元素进行的比较数。

现在,你是说你需要做所有的比较。如果N是,比如说256,那么对于每个元素,在实际比较的256个元素中,有64个是比较的.因此,无论如何,只有1/4的比较可以用双离子排序,所以如果你用一个头和每个元素进行比较,你最多只能获得25%的效率,但是只有在整个程序的那一部分(虽然每个元素的比较将是O(N)而不是O(log^2(n))和O(N) >O(log^2(N)。

这对你来说可能是很多,但现在让我们把它移到4096。现在您正在对每个元素进行12^2 = 144的比较.在总共需要4096个.

你会拯救..。3%的比较.这真的值得存那么多钱吗?你甚至可能得慢慢来。

但现在让我们看看问题,想一想.如果你无论如何都需要做N^2比较,因为你需要每对明智的比较…您甚至可以完全摆脱双离子排序,并通过将比较与其他项相加来找到该项的位置,假设您在比较中有一个确定性的断系机制。

编辑:您的比较度量实际上是一个集合的主导地位,但您也希望保持排序(换句话说,排序必须是稳定的),所以如果您正在进行最大排序,则还必须考虑到每个元素的索引。正因为如此,您需要以一种与主导地位不匹配的方式更改您的比较度量,如双离子排序不稳定

您还可能需要包括一种编码方式,而不是控制方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DominationEnum(Enum):
    DOMINATES = 1
    DOMINATED = 0
    NODOMINATION = -1


def foo(items)
    n = len(items);
    items_sorted= [null * n]
    items_dominance= [[false for j in range(n)] for i in range(n)]
    number_better_than = 0
    for i_index, i in enumerate(items):
        for j_index, j in enumerate(items):
            domination = is_dominant(i, j)
            items_dominance[i][j] = domination == DominationEnum.DOMINATES
            number_better_than += int(items_dominance[i][j]  or ((domination == DominationEnum.NODOMINATION) and (i_index < j_index))

        items_sorted[number_better_than] = i

以上是这种算法的串行代码,为了使其并行,您可以删除外部循环,并在每个线程实例中运行它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#i_index is thread index
def foo(items, items_sorted, items_dominance, i_index)
    number_better_than = 0
    for j_index, j in enumerate(items):
            domination = is_dominant(i, j)
            items_dominance[i][j] = domination == DominationEnum.DOMINATES
            number_better_than += int(items_dominance[i][j]  or ((domination == DominationEnum.NODOMINATION) and (i_index < j_index)))

    items_sorted[number_better_than] = i

或将双声速排序比较度量更改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
( i dominates j ) or (if neither i nor j dominates on another and index of i is before index of j) 

然后跑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def foo(items, items_dominance, i_index)
    number_better_than = 0
    for j_index, j in enumerate(items):
         domination = is_dominant(i, j)
         items_dominance[i][j] = domination == DominationEnum.DOMINATES

此外,通过找到[i][j]的控制并使用它来确定其他控制是什么,您可以将所需操作的数量减半(您可以知道我是控制j、是主导还是不占主导或支配j,这也给出了[j][i]的结果)。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/358393

复制
相关文章
firebase怎么用_firebase是什么
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168361.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
4.2K0
firebase怎么用_firebase是什么
CDN刷新目录不生效?
选择 “刷新变更资源” 模式,当用户访问匹配目录下资源时,会回源获取资源的 Last-Modify 信息,若与当前缓存资源一致,则直接返回已缓存资源,若不一致,回源拉取资源并重新缓存;
任雯霄
2020/12/30
6.1K1
Vue 实现前进刷新,后退不刷新的效果
假设列表页为 list.vue,详情页为 detail.vue,这两个都是子组件。
谭光志
2020/09/28
3K0
vue 参数变化页面不刷新
查询参数变化,不刷新 http://localhost:8081/#/detail?id=1 http://localhost:8081/#/detail?id=2 参数变化,不刷新 http://
onety码生
2018/11/21
2.5K0
js – form表单提交不刷新
大家已经发现了, 当我们点击submit提交form表单的时候, 他会刷新一次, 如果不想它刷新的话有下面两种方法:
全栈程序员站长
2022/08/01
14.6K0
RDP你的凭据不工作/RDP密码不刷新
如果你不属于上述的情况,请查看:https://learn.microsoft.com/zh-cn/windows-server/remote/remote-desktop-services/troubleshoot/rdp-error-general-troubleshooting#check-whether-a-group-policy-object-gpo-is-blocking-rdp-on-a-local-computer
阿龙w
2022/12/02
12.7K0
RDP你的凭据不工作/RDP密码不刷新
Laravel7使用Auth进行用户认证
Laravel7 的 laravel/ui 包提供了一种快速方法,可以使用一些简单的命令来支持你进行身份验证所需的所有路由和视图:
Lansonli
2021/10/09
5.8K0
vue强制刷新页面方法_vue页面回退不刷新
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
5K0
谷歌?新手不推荐 选它就对了
首先第一个好处就是可以登录账号,实现账号登录同步书签,添加书签方便多了,还能扩展组件。
江拥羡橙
2022/11/17
6330
谷歌?新手不推荐 选它就对了
将 Supabase 作为下一个后端服务
对于想快速实现一个产品而言,如果使用传统开发,又要兼顾前端开发,同时又要花费时间构建后端服务。然而有这么一个平台(Baas Backend as a service)后端即服务,能够让开发人员可以专注于前端开发,而无需花费大量时间和精力来构建和维护后端基础设施。
愧怍
2023/03/14
7.8K0
将 Supabase 作为下一个后端服务
nuxt+vue仿微信聊天界面|nuxt.js聊天室
nuxtjs是一个基于vue.js构建的服务端渲染框架。让你的网页也拥有SEO能力。只要是会vue,上手及非常简单了。
andy2018
2020/10/16
3.7K0
nuxt+vue仿微信聊天界面|nuxt.js聊天室
layui打开iframe窗口不刷新的问题
这个问题可能是我工作以来,最死磕不算bug的一个了,晚上熬夜到三点钟,终于找到了解决的办法。
王小婷
2019/04/29
4K0
layui打开iframe窗口不刷新的问题
在nuxt.js项目中对axios进行封装
不管是在服务端还是客户端获取数据都可以使用axios。在实际的开发过程中,每次请求中往往要携带一些自定义的参数或进行一些统一的处理,所以对axios进行封装是必不可少的。那么对于axios封装应该写在那个目录下呢?
用户3258338
2019/09/17
6.3K0
将 Supabase 作为下一个后端服务
对于想快速实现一个产品而言,如果使用传统开发,又要兼顾前端开发,同时又要花费时间构建后端服务。然而有这么一个平台(Baas Backend as a service)后端即服务,能够让开发人员可以专注于前端开发,而无需花费大量时间和精力来构建和维护后端基础设施。
愧怍
2023/02/24
4.7K0
将 Supabase 作为下一个后端服务
Firebase 如何创建登录 Token
Firebase 的 token 可以使用 firebase 命令行工具来进行创建。
HoneyMoose
2021/04/02
2.5K0
Firebase 如何创建登录 Token
JWT 的详细资源
1、laravel firebase/php-jwt token验证
八点半的Bruce、D
2023/02/28
2.9K0
JWT 的详细资源
WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围
WPF 的 VisualBrush 可以帮助我们在一个控件中显示另一个控件的外观。这是非常妙的功能。
walterlv
2023/10/22
4440
WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围
Vue 改变数据,页面不刷新的问题
最近在用 element-ui 开发一个网站,使用 table 组件时,发现修改完数据,有时候会延迟一两秒,页面才会发生变化。
谭光志
2020/09/28
3.4K0
点击加载更多

相似问题

如何持久化firebase-auth而不是使用Nuxt刷新?

220

Nuxt.js + nuxt-auth模块刷新jwt

314

Nuxt Auth函数不是反应性的,需要进行硬刷新。

12

Nuxt.js + Auth ( jwt刷新令牌)

25

刷新后FireBase auth签出

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文