Algorithm 从列表中返回唯一的数字集

Algorithm 从列表中返回唯一的数字集,algorithm,Algorithm,给定两个数字m和n,m小于n,返回一组从1到n的m个随机唯一数。例如,如果你有m=6和n=49,这与给随机彩票号码相同 一种方法是使用随机数生成器获取0到1之间的数字,乘以n,截断为整数,检查数字是否已在集合中,如果未添加到集合中,则重复该操作,直到有m个数字 另一种方法是首先创建一个数字为1到n的数组,随机对数字重新排序,读取前m个数字 我认为如果m比n小,第一个更好,例如,如果m=1和n=1000000,第一个明显更快。但是,如果m很大,我认为第二种方法会更好,例如,如果m=500000和n

给定两个数字m和n,m小于n,返回一组从1到n的m个随机唯一数。例如,如果你有m=6和n=49,这与给随机彩票号码相同

一种方法是使用随机数生成器获取0到1之间的数字,乘以n,截断为整数,检查数字是否已在集合中,如果未添加到集合中,则重复该操作,直到有m个数字

另一种方法是首先创建一个数字为1到n的数组,随机对数字重新排序,读取前m个数字

我认为如果m比n小,第一个更好,例如,如果m=1和n=1000000,第一个明显更快。但是,如果m很大,我认为第二种方法会更好,例如,如果m=500000和n=1000000,如果您不断得到已添加到集合中的返回数字,那么第一种方法可能需要重复很多次


我的问题是,当使用一种方法比使用另一种方法更有效时,有没有一种数学方法可以计算出m和n之间的关系?

如果你从数组[1,2,…,n]开始,你可以在从i到n随机选择的位置重复交换第i个元素和元素。如果从数组[1,2,…,n]开始,则可以在从i到n随机选择的位置重复交换第i个元素与该元素。如果从数组[1,2,…,n]开始,则可以在从i到n随机选择的位置重复交换第i个元素与该元素。如果从数组[1,2,…,n]开始,则可以在从i到n随机选择的位置重复交换第i个元素与该元素。这样做1我们用它来衡量一个算法,它表示时间成本随输入大小的增加而增加的速度

在您的情况下,您的第一个算法将不起作用。生成一个随机数,直到它不等于一个给定的数字,有可能需要无限的时间。因此,让我们通过以下方式对其进行一点改进:

  • 列出所有N个候选编号
  • 从1和N生成一个随机数R
  • 从列表中选择第R个编号
  • 从列表中删除所选号码;设N为N-1
  • 转至步骤2,直到获得M个选定数字
  • 该改进算法具有时间复杂度的上界。无论使用线性还是链表,步骤3~4的复杂度都是O(M)。它们将重复M次。该算法的总体复杂度为O(NM)

    第二个算法的复杂性是
    O(N)


    因此,第二种算法在复杂性方面是赢家。请注意,这只意味着当输入大小增加时,赢家的时间成本增加得较慢。这并不意味着它总是比另一个花更少的时间我们不以算法的绝对时间成本来衡量算法,因为它因不同的硬件、系统、语言和编译器等而异。我们以时间复杂度来衡量。

    我们以算法的时间成本来衡量算法,它表示时间成本随着输入大小的增加而增加的速度

    在您的情况下,您的第一个算法将不起作用。生成一个随机数,直到它不等于一个给定的数字,有可能需要无限的时间。因此,让我们通过以下方式对其进行一点改进:

  • 列出所有N个候选编号
  • 从1和N生成一个随机数R
  • 从列表中选择第R个编号
  • 从列表中删除所选号码;设N为N-1
  • 转至步骤2,直到获得M个选定数字
  • 该改进算法具有时间复杂度的上界。无论使用线性还是链表,步骤3~4的复杂度都是O(M)。它们将重复M次。该算法的总体复杂度为O(NM)

    第二个算法的复杂性是
    O(N)


    因此,第二种算法在复杂性方面是赢家。请注意,这只意味着当输入大小增加时,赢家的时间成本增加得较慢。这并不意味着它总是比另一个花更少的时间我们不以算法的绝对时间成本来衡量算法,因为它因不同的硬件、系统、语言和编译器等而异。我们以时间复杂度来衡量。

    我们以算法的时间成本来衡量算法,它表示时间成本随着输入大小的增加而增加的速度

    在您的情况下,您的第一个算法将不起作用。生成一个随机数,直到它不等于一个给定的数字,有可能需要无限的时间。因此,让我们通过以下方式对其进行一点改进:

  • 列出所有N个候选编号
  • 从1和N生成一个随机数R
  • 从列表中选择第R个编号
  • 从列表中删除所选号码;设N为N-1
  • 转至步骤2,直到获得M个选定数字
  • 该改进算法具有时间复杂度的上界。无论使用线性还是链表,步骤3~4的复杂度都是O(M)。它们将重复M次。该算法的总体复杂度为O(NM)

    第二个算法的复杂性是
    O(N)

    因此,第二种算法在复杂性方面是赢家。请注意,这只意味着当输入大小增加时,赢家的时间成本增加得较慢。这并不意味着它总是比另一个花更少的时间我们不以算法的绝对时间成本来衡量算法,因为它因不同的硬件、系统、语言和编译器等而异。我们采用tim
    E[X_i] = 1/p
    
    E[X_i] = p + (1 - p) * (1 + E[X_i])