Algorithm 不确定长度数组

Algorithm 不确定长度数组,algorithm,arrays,data-structures,binary-search,Algorithm,Arrays,Data Structures,Binary Search,如何在长度未知的排序数组中找到随机元素。我想你可以循环一些东西,但你不能事先确定长度。您可以通过循环项目来获得随机项目,并计算该项目应被拾取的概率 C从IEnumerable项中选择int的示例: 在第一项中,你得到一个介于0和0之间的随机数,当然是0,所以你保留该项。在第二项中,您得到一个介于0和1之间的随机数,如果它是0,则保留第二项。等等,直到物品用完。对于每个附加项,保留该项的概率会降低,这就是为什么集合中的任何特定项的概率都是相同的。我假设您的意思是如何找到元素是否是数组的一部分?不是

如何在长度未知的排序数组中找到随机元素。

我想你可以循环一些东西,但你不能事先确定长度。您可以通过循环项目来获得随机项目,并计算该项目应被拾取的概率

C从IEnumerable项中选择int的示例:

在第一项中,你得到一个介于0和0之间的随机数,当然是0,所以你保留该项。在第二项中,您得到一个介于0和1之间的随机数,如果它是0,则保留第二项。等等,直到物品用完。对于每个附加项,保留该项的概率会降低,这就是为什么集合中的任何特定项的概率都是相同的。

我假设您的意思是如何找到元素是否是数组的一部分?不是如何从数组返回随机元素

使用并假设长度非常大,你肯定有一个上限?。如果在每个步骤中选择的中间元素m超出数组边界,则需要一种方法来说明这一点,然后将搜索限制到索引小于m的元素


如果你没有办法判断一个元素是否在数组的边界之外,那么我看不出你如何解决这个问题。

查找一个随机元素听起来像是在挑选一个随机元素。但是我假设你想在数组中找到一个特定的元素,对吗?你怎么能不知道数组的长度呢?您如何知道您的索引超出了边界?您所说的“未知长度”是什么意思?你的意思是长度是不确定的,也就是说你甚至在运行时也不能知道它有多长,这似乎不太可能,或者长度在一个过程到下一个过程之间变化?在第二种情况下,你有一个大概的最小/最大长度吗?-1,这个问题太不清楚了,作者没有试图澄清-应该关闭-现在这个问题太不清楚了,没有任何意义。作者花了一个小时来澄清他想要什么,但似乎没有做任何尝试……但这不是一个数组,而且你也没有使用元素被排序的事实。@IVlad:.NET中数组的大小总是已知的,所以这部分没有真正意义。此解决方案适用于您可以迭代的任何集合。如果你想得到一个随机项目,那么这些项目是否被排序是完全不相关的。+1:这是从项目流中选择随机项目的一个很好的解决方案。归纳法可以很容易地证明,在步骤N中,每个项目都有1/N的机会被选择。我还不知道这条小溪被分类这一事实有什么关联…@Marc Gravell-我认为从这个问题中可以明显看出这一点。你是对的;我错过了这一点,但对于历史:我评论说它需要整理
Random rnd = new Random();
int cnt = 0;
int selected = 0;
foreach (int item in items) {
  if (rnd.Next(++cnt) == 0) {
    selected = item;
  }
}