当前位置: 首页 > 知识库问答 >
问题:

有没有更快的方法通过累积分布搜索?

易阳云
2023-03-14

我有一个列表 ,其中包含对项目进行抽样的概率(权重)。例如,列表包含如下所示的5个值。

我尝试了这样的方法,首先把概率列表做成累加形式。

0.1、0.5、0.7、0.8、1.0

那么我的做法如下。我生成一个随机double,并在列表上迭代以找到第一个大于随机double的项,然后返回它的索引

Random r = new Random();
double p = r.nextDouble();
int total = list.size();
for(int i=0; i < total; i++) {
 double d = list.get(i);
 if(d > p) {
  return i;
 }
}
return total-1;

我不确定二分搜索能有什么帮助。假设我生成了p=0.01。然后,二分搜索可以使用递归,如下所示。

compare 0.01 to 0.7, repeat with L = 0.1, 0.5
compare 0.01 to 0.1, stop 
compare 0.01 to 0.5, stop

0.01小于0.7、0.5和0.1,但我显然只想要0.1。因此,当使用二分搜索时,停止条件对我来说仍然不清楚。

如果有一个图书馆来帮助这类事情,我也很感兴趣。

共有1个答案

滕胜涝
2023-03-14

以下是如何使用二分搜索,从累积概率开始:

public static void main (String[] args) {
    double[] cdf = {0.1, 0.5, 0.7, 0.8, 1.0};
    double random = 0.75;  // generate randomly between zero and one
    int el = Arrays.binarySearch(cdf, random);
    if (el < 0) {
        el = -(el + 1);
    }
    System.out.println(el);
}

附言。当概率列表很短时,简单的线性扫描可能会证明与二分搜索一样有效。

 类似资料:
  • 这是我的代码: 如果我先调用readAllData(),然后再调用readData(),我会得到一个RangeError:

  • 我有两个不同长度的向量,每个向量包含0到50之间的数字。有些数字在向量中不包含,其他数字可能出现多次。 我想画一条线,显示每个数字在每个向量中包含的频率,即数字的频率。 如果我将中断设置为每个可能的数字之间,我可以绘制显示频率的直方图: 我知道有一个经验累积分布函数(),它会形成一个S形;但我想要的是一个非累积的经验分布函数,它将导致类似阶梯形钟形曲线的结果,类似于直方图的轮廓。 我能得到的最接近

  • 我想使用以下循环创建一个新列。表中只有“open”和“start”列。我想创建一个新列“startopen”,如果“start”等于1,那么“startopen”等于“open”。否则,“startopen”等于此新创建列上方行中的任何“startopen”。目前,我能够通过以下方式实现这一点: 这有效,但对于大型数据集来说非常慢。是否有任何内置函数可以更快地完成此操作?

  • 我使用以下行对Sqlite查询的行进行循环。 当行数大约为15000时,需要很长时间。空的块需要大约4秒,而有一些代码的

  • 我对cosmos DB的分区密钥感到困惑。我有一个数据库/容器,大约有4000条小记录。如果我使用分区键筛选器尝试sql语句,则RUs和持续时间会比不使用时长更大。 有人明白这一点吗? 在此示例中,容器的分区键是/partitionkey