Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从多组任意项目中拾取项目时最小化重复项_Algorithm_Optimization - Fatal编程技术网

Algorithm 从多组任意项目中拾取项目时最小化重复项

Algorithm 从多组任意项目中拾取项目时最小化重复项,algorithm,optimization,Algorithm,Optimization,由于我不确定如何表达这个问题,我将用一个与我试图实现的目标非常相似的例子来说明它 我正在寻找一种方法来优化执行以下任务所需的时间 假设我有三组标记为“A”、“B”和“C”的数字,每组包含任意数量的整数 我收到一堆要求“打包”数字的订单,每个订单要求特定的整数组合,每组一个。所以一个顺序可能看起来像“A3,B8,C1”,这意味着我需要从集合a中获取一个3,从集合B中获取一个8,从集合C中获取一个1 任务很简单:抓起一张订单,看看数字,然后去收集它们,把它们放在一个“包”里 我需要一段时间来收集这些

由于我不确定如何表达这个问题,我将用一个与我试图实现的目标非常相似的例子来说明它

我正在寻找一种方法来优化执行以下任务所需的时间

假设我有三组标记为“A”、“B”和“C”的数字,每组包含任意数量的整数

我收到一堆要求“打包”数字的订单,每个订单要求特定的整数组合,每组一个。所以一个顺序可能看起来像“A3,B8,C1”,这意味着我需要从集合a中获取一个3,从集合B中获取一个8,从集合C中获取一个1

任务很简单:抓起一张订单,看看数字,然后去收集它们,把它们放在一个“包”里

我需要一段时间来收集这些号码,而且常常有一个订单要求与前一个订单相同的号码,所以我决定存储所有的包裹,以便以后检索;这样,我处理重复订单所需的时间将大大减少,而不必再次收集相同的数字

收集一个号码所需的时间相当长,但如果那天我有很多订单的话,就没有逐个检查每个包裹所需的时间长

例如,如果我有以下几组数字和顺序

set A: [1, 2, 3] set B: [4, 5, 6, 12, 18] set C: [7, 8] Order 1: A1, B6, C7 Order 2: A3, B5, C8 Order 3: A1, B6, C7 A组:[1,2,3] B组:[4,5,6,12,18] C组:[7,8] 订单1:A1、B6、C7 订单2:A3、B5、C8 订单3:A1、B6、C7 我会把订单1和订单2的包装放在一起,但是我注意到订单3是一个重复的订单,所以我可以选择只拿第一个订单的包装,然后快速完成最后一个订单

目标是优化处理一堆订单所需的时间。目前我提出了两种方法,但也许还有更多的方法

  • 收集每个订单的编号,不管它是否重复。最后我收到了很多包裹,在极端情况下,有人批量订购50个相同的包裹,这显然是浪费时间

  • 检查包是否已经存在于缓存中,可能对订单使用某种散列方法


  • 有什么想法吗?

    不知道确切的时间是不可能确定的,但在我看来,好像你的想法2,使用某种哈希表存储以前的订单是一种方法。

    关于如何获取数据以组成包等,没有给出太多细节。这使得很难找到不同的解决方案来解决您的问题。例如,现有包可能会引导您找到组成新包所需的数据,尽管它们在某种程度上有所不同。为此,实际上有一些专用的散列方法,比如位置敏感散列


    考虑到你提出的两种方法,选择2号公路听起来很自然。索引中的散列听起来很简单(第一顺序很容易由数字167或字符串“167”识别,对吗?),因此使用散列不会有任何实际的缺点。可能是内存限制,因为您需要保留旧包。还有一些常见的方法可以定义哪些包要保存在(散列)缓存中,哪些包要丢弃。

    这只是一个基本问题-我们要查看多少个订单堆栈?还有,你的数据集有多大,1000个数字,数百万个或更多?那一堆订单可能会达到数万个,而数据集更合理;例如,在某些情况下,多个包的A和B值相同,但C值不同。这将节省我收集其他两个数字的时间,只需使用C值即可。也许我可以设置各种哈希表,其中一个只检查它是否是同一个包,另一个检查某些元素是否相同(AB、BC或AC)