假设我们有一些项目,每个项目都定义了一些部分排序规则,如下所示:
我现在
A
想成为B
我
C
和我想成为之后A
但之前D
因此,我们有A,B,C,D
符合以下规则的项目:
A>B
C<A
, C>D
B
并且D
在排序中没有“首选项”,并且被视为相等。如您所见,传递关系规则在这里不起作用。但是,如果A>B
仍然表示B<A
。因此,排序可能会有多种结果:
如何实现处理这种情况的排序算法?
原因是:有多个可加载模块,其中一些模块以某种方式“依赖”其他模块。每个模块都可以声明相对于其他模块的简单规则:
在模块A之前加载我
在模块B之后加载我
在模块A之前但在模块B之后再加载我
现在我需要以某种方式实现此排序.. :)
答案:帕迪·麦卡锡(MIT)编写的代码
## {{{ http://code.activestate.com/recipes/577413/ (r1)
try:
from functools import reduce
except:
pass
data = {
'des_system_lib': set('std synopsys std_cell_lib des_system_lib dw02 dw01 ramlib ieee'.split()),
'dw01': set('ieee dw01 dware gtech'.split()),
'dw02': set('ieee dw02 dware'.split()),
'dw03': set('std synopsys dware dw03 dw02 dw01 ieee gtech'.split()),
'dw04': set('dw04 ieee dw01 dware gtech'.split()),
'dw05': set('dw05 ieee dware'.split()),
'dw06': set('dw06 ieee dware'.split()),
'dw07': set('ieee dware'.split()),
'dware': set('ieee dware'.split()),
'gtech': set('ieee gtech'.split()),
'ramlib': set('std ieee'.split()),
'std_cell_lib': set('ieee std_cell_lib'.split()),
'synopsys': set(),
}
def toposort2(data):
for k, v in data.items():
v.discard(k) # Ignore self dependencies
extra_items_in_deps = reduce(set.union, data.values()) - set(data.keys())
data.update({item:set() for item in extra_items_in_deps})
while True:
ordered = set(item for item,dep in data.items() if not dep)
if not ordered:
break
yield ' '.join(sorted(ordered))
data = {item: (dep - ordered) for item,dep in data.items()
if item not in ordered}
assert not data, "A cyclic dependency exists amongst %r" % data
print ('\n'.join( toposort2(data) ))
## end of http://code.activestate.com/recipes/577413/ }}}
您将需要构造一个依赖关系图(这只是有向图的一种形式),然后遵循拓扑排序的顺序。自从我参加组合类课程以来已经有一段时间了,因此Wikipedia文章可能比拓扑分类算法更有帮助。我希望给您适当的术语会有所帮助。:)
就构造图而言,基本上您只需要使每个模块具有该模块的依赖关系列表即可。
您只需要稍微改一下规则即可…“我是C,我想在A之后但在D之前”表示为“ C取决于A”以及“ D取决于C”,这样一切都朝着标准方向流动。
亿景智图的智能分单服务产品,用于替代传统的人工劳动,将订单分拣智能化,帮助企业将订单自动分配到配送站点或者配送区域,减少企业在分单环节的人工投入,提高企业的分单效率。在节省成本、提高效果的同时,分单功能还具备以下特性: 操作简单,即拿即用。 错误地址纠错功能,大幅提高分单准确率。 团队协同,对参与分单的帐号进行权限细分,在提高协同效率的同时保证企业数据的安全性。 ● 管理业务片区 ● 单条订单分拣
提示: ●分拣地址不在区域范围内,提示地址解析失败。 ●单条分拣可以输入订单地址或是经纬度坐标。 ●分拣经纬度坐标必须为百度坐标系的坐标。 ●.经纬度输入格式:经度在前,纬度在后,中间用英文逗号间隔,如:116.404261,39.915085。 操作步骤: ①选择"订单分拣"模块。 ②点击"进入分单"按钮,进入分单模式。 操作动图: [查看原图]
问题内容: 我有2个实体:汽车和车轮(oneToMany),我想检索我的汽车,其中有所有车轮,并且(这是棘手的部分)由wheels.location排序。下面的代码引发异常,并显示消息“非法尝试取消引用集合”。 任何想法如何做到这一点,如果这可以在HQL中进行? 问题答案:
分单结果按照时间统计展示 支持按照时间查询 支持切换各种风格展示: 海量图、热力图、格网图
我们必须按降序对数组进行部分排序。 我知道d::partial_sort但它是按升序排列的。 http://en.cppreference.com/w/cpp/algorithm/partial_sort. 是他们的任何其他这样的功能,可以这样做,或任何快速算法这样做。
提示: ●支持Excel或CSV,最大可支持5000条标注数据。 ●上传表格数据中,第一列必须为订单地址且只能有一列。 操作步骤: ①登录账号进入工作台,选择地图点击编辑进入编辑地图页面,点击订单分拣模块。 ②点击"进入分单"按钮,进入订单分拣页面。 ③选择"批量分拣"->点击"上传文件"(上传要批量分拣的文件)。 操作动图: [查看原图]
问题内容: 我正在寻找一种数据结构的Java实现,该实现包含一组元素的集合,为这些元素定义了 部分排序 ,并且允许以某种 拓扑顺序 对这些元素进行迭代(任何可能的排序都可以;最好是稳定的)随着集合内容的变化而排序)。 理想的情况下,将落实一个,或接口,并支持所有的接口上的方法。在指定总排序方面,可以使用实例化集合,并且如果比较的两个元素彼此之间没有排序,则比较器可以引发异常(?)。另外,如果插入的
问题内容: 仅对ArrayList的一部分进行排序的 最有效 方法是什么?说一个包含10个元素的Arraylist中从索引0到3的所有元素。 Java中有可用的库函数吗? 除了排序整个列表! 编写高度优化的自定义排序功能将需要一些工作。 问题答案: 在文档中对此进行了描述: 公共列表subList(int fromIndex,int toIndex) 返回此列表中指定的fromIndex(包括)和