社区首页 >问答首页 >对列表进行排序,了解其中一些元素的比较结果?

对列表进行排序,了解其中一些元素的比较结果?
EN

Stack Overflow用户
提问于 2015-08-11 13:31:29
回答 2查看 653关注 0票数 4

目标是对n个未知变量{x0,x1,x2,.x(n-1)}使用m比较结果的列表C(布尔值)。每个比较是在两个n个变量之间进行的,例如x2 < x5,每个比较的对指数都是固定的,并且提前给定。还给出了:C中的所有对都是唯一的(即使翻转时也是如此,例如,对x0,x1表示没有对x1,x0),而且永远不要将变量与自身进行比较。这意味着C最多有n*(n-1)/2条目。

所以问题是,我能证明我的m比较列表C足以对列表X排序吗?显然,如果C是最大的可能长度(有所有可能的比较)。但更短的名单呢?

然后,如果已经证明C包含足够的信息来排序,那么我应该如何执行排序呢?

EN

回答 2

Stack Overflow用户

发布于 2015-08-11 13:47:56

让我们想象一下,您要对对象集合进行排序,并从它们生成一个图,每个对象都有一个节点。然后,您将得到一组表示比较进行情况的对列表。你可以把这些看作是图中的边:如果你知道对象x比对象y要小,那么你可以从x到y画一个边。

假设比较的结果是一致的-也就是说,您没有任何循环-您应该有一个有向无圈图。

想一想,如果你对这个DAG进行拓扑排序,会发生什么。最后,您将得到一个与所有约束一致的值的可能排序。原因是,在拓扑排序中,如果有从y到x的任何传递的边序列,就不会将元素x放在元素y之前,如果有一个传递的比较序列表明y先于x,则从y到x有一个传递的边序列。

实际上,您可以提出一个更强的声明: DAG的所有拓扑顺序的集合正是满足所有约束的所有可能的有序的集合。我们已经论证了每个拓扑序都满足所有的约束,所以我们现在所要做的就是证明每一个满足所有约束的序列都是一个有效的拓扑序。这里的论点是,如果你遵守所有的约束条件,你就不会把序列中的任何元素放在它传递性比较较小的东西之前,所以你永远不会把序列中的任何元素放在有路径的东西前面。

这给了我们一个很好的方法来解决这个问题:用这种方式形成的图,看看它是否有一个拓扑序。如果是这样的话,那么这种排序就是唯一的排序顺序。如果没有,那么就有两个或更多的订单。

那怎么做才是最好的呢?进行拓扑排序的标准算法之一是用索引树对每个节点进行注释,然后反复取出索引零的节点并调整其后继节点的索引。DAG有一个拓扑序,如果在执行这个算法的过程中,每个阶段都有一个索引零的节点,因为在这种情况下拓扑排序是强制的。

通过正确的设置和数据结构,您可以实现这一点,以便在时间上运行O(n + m),其中n是节点数,m是约束数。我将把这些细节留给读者,作为一个众所周知的练习。:-)

票数 4
EN

Stack Overflow用户

发布于 2015-08-11 13:43:56

你的问题可以归结为著名的拓扑排序

证明"C包含足够的信息来排序“就是证明拓扑排序的唯一性:

如果拓扑排序具有排序顺序中的所有连续顶点对都由边连接的性质,则这些边在DAG中形成有向哈密顿路径。如果存在哈密顿路径,则拓扑排序顺序是唯一的;没有其他顺序尊重路径的边。相反,如果拓扑排序不形成哈密顿路径,则DAG将有两个或多个有效的拓扑序,因为在这种情况下,总是可以通过交换两个不通过边连接的连续顶点来形成第二个有效序。因此,尽管更一般有向图的哈密顿路径问题具有NP-硬度,但仍有可能在线性时间检验是否存在唯一序,以及是否存在哈密顿路径(Vernet & Markenzon 1997)。

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

https://stackoverflow.com/questions/31952333

复制
相关文章
Fabric.js 控制元素层级 👑
元素数量多了,难免会产生重叠。又或者某些效果需要几个元素重叠起来。这些情况大概率需要控制元素的层级。
德育处主任
2022/08/31
4K0
Fabric.js 控制元素层级 👑
强烈推荐!汇总了几个前端离不开的2D图形库
在现代前端开发中,无论是构建游戏、数据可视化还是动画效果,合适的2D图形库可以增加用户的趣味性,接下来就给大家介绍几个常用的2D图形库
程序员老鱼
2023/08/10
1.4K0
强烈推荐!汇总了几个前端离不开的2D图形库
FabricJS gotchas/FabricJS陷阱[通俗易懂]
这个页面包含了第一次接触fabricJS的人打开的最常见问题的列表。这些缺陷的产生,既有解释不清的原因,也有文档不完善的原因。在这里,我们试图解决共同的问题。
全栈程序员站长
2022/11/01
1.3K0
fabric.js和高级画板
本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式、网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角
磊哥
2018/07/04
4.6K0
小智周末学习发现了 10 个好用JavaScript图像处理库
用 JavaScript 处理图像可能非常困难且繁琐。 幸运的是,有许多库可以让这些变得简单得多。 下面介绍一些图像处理的库。
前端小智@大迁世界
2020/06/18
2.4K0
小智周末学习发现了 10 个好用JavaScript图像处理库
fabric.js和高级画板
本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式、网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角
磊哥
2018/05/08
11.3K1
fabric.js和高级画板
fabric.js开发图片编辑器的细节实现
之前写过一篇笔记,《使用fabric.js 快速开发一个图片编辑器》,简单介绍了如何用vue和fabric.js快速开发一款编辑器。
100000996525
2023/02/14
3.6K0
fabric.js开发图片编辑器的细节实现
socket+fabricjs 实现画板同步
A通过socket链接传输canvas数据,express做转发,B监听socket得到数据并渲染。
玖柒的小窝
2021/11/04
1.4K0
socket+fabricjs 实现画板同步
9个JavaScript图像处理库,收藏好留备用
1:pica 一个在浏览器中调整图像大小,而不会出现像素失真,处理速度非常快的图片处理库
王小婷
2021/05/24
2.8K0
9个JavaScript图像处理库,收藏好留备用
实战fabric.js教程及API
整个页面是一个vue项目中的组件,使用的主要库是fabricjs 官网为http://fabricjs.com/ 是一个操作canva和svg的库
拿我格子衫来
2022/01/24
2.1K0
实战fabric.js教程及API
绑定事件中 如可控制函数的执行次数
var flag = true; function onlyOne() { if(flag) { "这里是要执行的代码"; } flag = false//该方法是控制函数仅执行一次 因为flag是全局变量 onlyOne()函数执行一次后flag就变成false了 函数就执行不了了
大当家
2018/06/28
2.3K0
fabricjs常用方法
官网:http://fabricjs.com/ fabricjs为canvas的一个操作插件,功能较为齐全,下面为常用的知识点 //1: 获得画布上的所有对象: var items = canvas.getObjects(); //2: 设置画布上的某个对象为活动对象。 canvas.setActiveObject(items[i]); //3:获得画布上的活动对象 canvas.getActiveObject() //4:取消画布中的所有对象的选中状态。 canvas.discardActiveOb
星辰_大海
2023/03/16
2K1
fabricjs常用方法
Fabric.js 文本自动换行的实现方式
在 fabric.js 提供的文本组件中,默认状态是不会自动换行。如果你的使用场景中需要自动文本自动换行,可以使用 Textbox ,并将 splitByGrapheme 设置为 true 即可。
德育处主任
2022/09/23
8.5K0
Fabric.js 文本自动换行的实现方式
Fabric.js 橡皮擦的用法(包含恢复功能)
Fabric.js 的基础包并没有包含橡皮擦模块,如果你的项目需要使用橡皮擦,要使用定制版的 Fabric.js 。
德育处主任
2022/09/23
2.7K0
Fabric.js 橡皮擦的用法(包含恢复功能)
如何在本地测试Fabric Code
前一篇博客讲到了如何编译本地的Fabric Code成镜像文件,那么如果我们想改Fabric源代码,实现一些Fabric官方并没有提供的功能,该怎么办呢?这时我们除了改源码,增加需要的功能外,还需要能够跑通Fabric的测试。Fabric的测试主要包括单元测试和行为测试,下面分别介绍。
深蓝studyzy
2022/06/16
8530
如何在本地测试Fabric Code
Hyperledger Fabric Node.js开发中如何使用日志
Hyperledger Fabric Node.js开发中如何使用日志?本教程就来演示下如何使用hyperledgefabric node.js客户端日志记录功能。
笔阁
2019/07/08
9770
34 个今年11月最受欢迎的 JavaScript 库
在编写调试Node.js项目,修改代码后,需要频繁的手动close掉,然后再重新启动,非常繁琐。现在,我们可以使用nodemon这个工具,它的作用是监听代码文件的变动,当代码改变之后,自动重启。
前端小智@大迁世界
2022/06/15
2.2K0
34 个今年11月最受欢迎的 JavaScript 库
js如何在前端控制台打印
不同方法展示效果也不同,上图是log()输出的,下图是warn()输出的以及error()输出的。
全栈程序员站长
2022/07/22
5.1K0
js如何在前端控制台打印
TX Fabric时钟输出控制块
TX时钟分频器控制块有两个主要部分:串行时钟分频器控制和并行时钟分频器和选择器控制。
Reborn Lee
2021/11/15
1.5K0
TX Fabric时钟输出控制块
如何在p5.js里控制相机?
但是当学校课程要求(比如今年UCL的DFPI),或者没有其他前端基础的情况下,想把processing里的一些效果在网页上展示,这时候可能就不得不使用p5.js了。
UDM Lab
2021/01/04
2.1K0
如何在p5.js里控制相机?

相似问题

Fabric.js -触摸事件传播

115

如何在fabric.js中实现视频效果

11

如何在fabric js中实现橡皮擦

10

触摸时的FabricJS画布坐标

246

FabricJS触摸平移/缩放整个画布

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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