Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/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
Arrays 从具有空值的数组中随机选择非空元素的复杂性是什么?_Arrays_Random_Time Complexity_Big O - Fatal编程技术网

Arrays 从具有空值的数组中随机选择非空元素的复杂性是什么?

Arrays 从具有空值的数组中随机选择非空元素的复杂性是什么?,arrays,random,time-complexity,big-o,Arrays,Random,Time Complexity,Big O,假设我有一个数组,我想从数组中随机选择元素,但有些数组元素为空,如下所示: [0, 1, 3, null, 3, 2, null, 9, 12] 如果我随机选择它们(使用一个好的、无偏的随机数生成器),并落在空值上,那么我会再次随机选择,直到找到一个非空元素。我这样做是为了避免在我的选择中引入偏见 问题是:这种选择的时间复杂度是多少(用大O表示法,或者更合适的时间复杂度表示法) 显然,如果所有元素都为null,那么它将永远不会完成,如果所有元素都不为null,那么它就是O(1),但我不清楚如何

假设我有一个数组,我想从数组中随机选择元素,但有些数组元素为空,如下所示:

[0, 1, 3, null, 3, 2, null, 9, 12]
如果我随机选择它们(使用一个好的、无偏的随机数生成器),并落在空值上,那么我会再次随机选择,直到找到一个非空元素。我这样做是为了避免在我的选择中引入偏见

问题是:这种选择的时间复杂度是多少(用大O表示法,或者更合适的时间复杂度表示法)

显然,如果所有元素都为null,那么它将永远不会完成,如果所有元素都不为null,那么它就是O(1),但我不清楚如何表示中间的值


我知道另一种组织数组的方式可以避免漏洞,然后它可能总是O(1):我不是问如何更好地实现它,我是问如何表达这种复杂性。

正如您所指出的,在最坏的情况下,该算法永远不会终止,因此是未定义的(或无限)


您可能更感兴趣的是,它比最坏情况下的复杂度更常用来描述您的算法。

谢谢,我想我没有考虑过这种算法的时间复杂度可能未定义的可能性。这并不是您想要的,但我想指出的是,您甚至不需要更改数组的组织,就可以使时间复杂度达到O(N)(以O(N)空间为代价)。只需在已知的空值之间随机选择即可。IE:从随机选择索引0和8开始。如果得到索引6,则随机选择0到5和7到8之间的值。选择一个较大的可用间隔可能更好。0和5之间的随机选择可能导致索引3。可用的间隔是0到2,4到5,7到8,其中任何一个都会产生有效值。我可以看到这是如何工作的,但这不会增加随机选择的偏差吗?毕竟,这些区域的大小不尽相同……公平地说,这会给随机选择增加一些偏差。如果这是一个主要问题,你可以把它们当作链表。可以将间隔0到2、4到5和7到8计算为7个元素的列表,然后从中随机选择一个索引。尽管如此,您还需要确定索引引用的元素在哪个区间,这似乎需要使用区间树,使算法为O(N logn)。我还认为,对于我的第一个算法,平均时间是O(k/N),对于这个算法,平均时间是O((k/N)log k),其中k是空值的数量。最坏情况下的原始算法可以通过在m次迭代后找到空值的概率来更好地描述,即O((k/N)^m)),其中k是数组中空值的数量。如果数组没有非空元素,则在无限次迭代后找到空值的概率为1,因此算法不会终止。