Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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 整理成千上万张查克·E·奶酪票_Algorithm_Sorting_Math_Multidimensional Array - Fatal编程技术网

Algorithm 整理成千上万张查克·E·奶酪票

Algorithm 整理成千上万张查克·E·奶酪票,algorithm,sorting,math,multidimensional-array,Algorithm,Sorting,Math,Multidimensional Array,我需要将n千大小的随机唯一正整数数组排序为连续整数组,每个整数组的大小为k或更大,然后进一步分组为任意正整数j的红利 换言之,假设我在Chuck E.Cheese工作,我们有时会赠送免费门票。我在地板上有几十万张票,我想知道哪个员工分发了什么,但只针对大于500的连续整数的票组。每个员工都有一个从0到100的随机数分配给他们。该数字对应于发放的“批次”票证,即员工1发放的从000000到001499的票证,员工2发放的从001500到002999的票证,依此类推。大量的票丢失或丢失了。我只关心连

我需要将n千大小的随机唯一正整数数组排序为连续整数组,每个整数组的大小为k或更大,然后进一步分组为任意正整数j的红利

换言之,假设我在Chuck E.Cheese工作,我们有时会赠送免费门票。我在地板上有几十万张票,我想知道哪个员工分发了什么,但只针对大于500的连续整数的票组。每个员工都有一个从0到100的随机数分配给他们。该数字对应于发放的“批次”票证,即员工1发放的从000000到001499的票证,员工2发放的从001500到002999的票证,依此类推。大量的票丢失或丢失了。我只关心连续票号大于500的组

对我来说,整理这堆东西最快的方法是什么

编辑: 根据@trincot的要求,以下是一个已制定的示例:

我在地板上有150000张不同的票,从1000000张到200000张不等(即从票堆中丢失50001张随机票)

步骤1:使用算法将每张票据从最小到最大排序

第二步:逐个检查门票列表,只收集“连续性”大于500的门票。i、 e.我记录我找到的连续值的数量,只记录那些计数为500或更高的值。如果我有409到909张票,但没有408或1000张,那么我会保留那群人,但如果那群人错过了409到909之间的任何一张票,我会把那群人赶出去继续前进

步骤3:将所有新排序的组组合在一起,每个组的大小都在500或更大

第四步:通过再次逐个检查最终数字,将每个数字除以1500,四舍五入到最接近的整数,然后将它们放入各自的一堆中,每一堆代表一名员工,从而确定哪些票属于谁

最终的结果是一堆堆信息告诉我哪些员工一次发放了500多张票,他们发放了多少次,以及他们用了什么票

带编号的样本: 式中,k==3,j=1500;k是最小连续整数分组大小,j是最终票证间隔分组大小,即5、6和7属于第0组大小为1500的间隔,5996、5997、5998、5999属于第三组大小为1500的间隔

输入:[559968111000100159998110,759989825001250,681095997]


输出:[0:[5,6,7],3:[5996599759985999],5:[810981108111]

这是我能想到的最快方法中未经测试的Python。对于找到的每个感兴趣的范围,它将只返回成对的第一张/最后一张票证

def grouped_tickets (tickets, min_group_size, partition_size):
    tickets = sorted(tickets)
    answer = {}
    min_ticket = -1
    max_ticket = -1
    next_partition = 0
    for ticket in tickets:
        if next_partition <= ticket or max_ticket + 1 < ticket:
            if min_group_size <= max_ticket - min_ticket + 1:
                partition = min_ticket // partition_size
                if partition in answer:
                    answer[partition].append((min_ticket, max_ticket))
                else:
                    answer[partition] = [(min_ticket, max_ticket)]
            # Find where the next partition is.
            next_partition = (ticket // partition_size) * partition_size + partition_size
            min_ticket = ticket
            max_ticket = ticket
        else:
            max_ticket = ticket

    # And don't lose the last group!
    if min_group_size <= max_ticket - min_ticket + 1:
        partition = min_ticket // partition_size
        if partition in answer:
            answer[partition].append((min_ticket, max_ticket))
        else:
            answer[partition] = [(min_ticket, max_ticket)]

    return answer
def分组票据(票据、最小组大小、分区大小):
票证=已排序(票证)
答案={}
min_票证=-1
最大票数=-1
下一个分区=0
车票中的车票:

如果next_partition这里是我能想到的最快方法的未经测试的Python。对于找到的每个感兴趣的范围,它将只返回成对的第一张/最后一张票证

def grouped_tickets (tickets, min_group_size, partition_size):
    tickets = sorted(tickets)
    answer = {}
    min_ticket = -1
    max_ticket = -1
    next_partition = 0
    for ticket in tickets:
        if next_partition <= ticket or max_ticket + 1 < ticket:
            if min_group_size <= max_ticket - min_ticket + 1:
                partition = min_ticket // partition_size
                if partition in answer:
                    answer[partition].append((min_ticket, max_ticket))
                else:
                    answer[partition] = [(min_ticket, max_ticket)]
            # Find where the next partition is.
            next_partition = (ticket // partition_size) * partition_size + partition_size
            min_ticket = ticket
            max_ticket = ticket
        else:
            max_ticket = ticket

    # And don't lose the last group!
    if min_group_size <= max_ticket - min_ticket + 1:
        partition = min_ticket // partition_size
        if partition in answer:
            answer[partition].append((min_ticket, max_ticket))
        else:
            answer[partition] = [(min_ticket, max_ticket)]

    return answer
def分组票据(票据、最小组大小、分区大小):
票证=已排序(票证)
答案={}
min_票证=-1
最大票数=-1
下一个分区=0
车票中的车票:

如果next_partition,下面是如何在Python中实现它:

从集合导入defaultdict
def分区(数据,k,j):
数据=已排序(数据)
开始=数据[0]#假设数据不是空列表
计数=0
output=defaultdict(list)#在引用时自动创建分区
对于数据中的值:
bucket=value//j#整数除法
如果值%j==开始%j+计数:#在同一分区中且连续?
计数+=1
如果计数=k:
#添加到目前为止我们跳过的k个条目:
输出[bucket].extend(列表(范围(开始,开始+计数)))
elif计数>k:
输出[bucket]。追加(值)
其他:
开始=值
计数=1
返回指令(输出)
#问题中给出的示例:
数据=[559968111000100159998110,75998,25001250,681097]
打印(分区(数据,k=3,j=1500))
#输出{0:[5,6,7],3:[5996599759985999],5:[810981108111]}

以下是如何在Python中执行此操作:

从集合导入defaultdict
def分区(数据,k,j):
数据=已排序(数据)
开始=数据[0]#假设数据不是空列表
计数=0
output=defaultdict(list)#在引用时自动创建分区
对于数据中的值:
bucket=value//j#整数除法
如果值%j==开始%j+计数:#在同一分区中且连续?
计数+=1
如果计数=k:
#添加到目前为止我们跳过的k个条目:
输出[bucket].extend(列表(范围(开始,开始+计数)))
elif计数>k:
输出[bucket]。追加(值)
其他:
开始=值
计数=1
返回指令(输出)
#问题中给出的示例:
数据=[559968111000100159998110,75998,25001250,681097]
打印(分区(数据,k=3,j=1500))
#输出{0:[5,6,7],3:[5996599759985999],5:[810981108111]}

是否事先知道集团的范围?如果在你的例子中,你得到的输入是1499,然后是1500:那么你会说它们是相邻的,属于同一组……但是你在1500处做了一条分割线。股息是多少?你能用k给出一个更详细的例子吗?@trincot是的,范围是事先知道的。股息不是一个完全正确的术语,但我使用它是因为最后我