当前位置: 首页 > 面试题库 >

部分订单排序?

王宏扬
2023-03-14
问题内容

假设我们有一些项目,每个项目都定义了一些部分排序规则,如下所示:

我现在A想成为B

C和我想成为之后 A但之前D

因此,我们有A,B,C,D符合以下规则的项目:

  • A>B
  • C<AC>D
  • 没有其他的!因此,B并且D在排序中没有“首选项”,并且被视为相等。

如您所见,传递关系规则在这里不起作用。但是,如果A>B仍然表示B<A。因此,排序可能会有多种结果:

  1. A B C D
  2. 交流数据库
  3. ACBD
  4. A B C D

如何实现处理这种情况的排序算法?

原因是:有多个可加载模块,其中一些模块以某种方式“依赖”其他模块。每个模块都可以声明相对于其他模块的简单规则:

在模块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(包括)和