生成[iLow, iHigh]之间的无重复的iCount个int型随机数

/*******************************************************************************
 * Function    : DistinctRandNumber
 * Description : 生成[iLow, iHigh]之间的无重复的iCount个int型随机数,存放在数组aiNumber中
 * Parameters  : (1) const int iLow :要生成的随机数的最小值
 *               (2) const int iHigh :要生成的随机数的最大值
 *               (3) const int iCount : 要生成的随机数个数
 *               (4) int aiNumber[] : 存放生成的iCount个随机数
 * Return      : int =0表示成功,其它表示失败
 * Notes       : iLow应该小于iHigh,iCount应该不大于(iHigh - iLow + 1)
 ******************************************************************************/
int DistinctRandNumber(const int iLow, const int iHigh, const int iCount,
        int aiNumber[])
{
    if (iLow >= iHigh)
    {
        return -1;
    }

    // 最多可能产生的随机数个数
    const int iTotal = iHigh - iLow + 1;

    // 所需要的个数大于最多可能产生的随机数个数
    if (iCount > iTotal)
    {
        return -1;
    }

    // 将随机数可能的取值先存放在一个数组中
    int* piTemp = new int[iTotal];
    if (!piTemp)
    {
        return -1;
    }

    // 初始化数组
    int i;
    for (i = 0; i < iTotal; i++)
    {
        piTemp[i] = i + iLow; // 随机数可能的取值
    }

    srand((unsigned int) time(NULL));

    int iRange = iTotal;
    int iIdx;
    int j;

    for (j = 0; j < iCount; j++)
    {
        iIdx = rand() % iRange; // iIdx为[0,iRange)范围内数组下标
        aiNumber[j] = piTemp[iIdx]; // 取这个下标的随机数
        piTemp[iIdx] = piTemp[iRange - 1]; // 将这个已经使用过的随机数从数组中移除(用最后一个元素覆盖)
        iRange--; // 随机范围减1
    }

    delete[] piTemp;
    return 0;
}

将Diamond Search算法改为对数搜索算法的代码实现如下: ``` // 定义搜索区域的大小 int search_size = 16; // 计算搜索区域的起始点和结束点 int search_x_start = x_curr + xoff - search_size / 2; int search_x_end = search_x_start + search_size - 1; int search_y_start = y_curr + yoff - search_size / 2; int search_y_end = search_y_start + search_size - 1; // 定义搜索精度,n为划分子区域的次数 int n = 3; int search_step = search_size / pow(2, n); // 定义当前最小SAD和对应的MV int min_sad = INT_MAX; MV best_mv; // 对搜索区域进行分块,每个子区域的大小为search_step * search_step for (int i = search_x_start; i <= search_x_end; i += search_step) { for (int j = search_y_start; j <= search_y_end; j += search_step) { // 计算子区域的起始点和结束点 int sub_search_x_start = i; int sub_search_x_end = i + search_step - 1; int sub_search_y_start = j; int sub_search_y_end = j + search_step - 1; // 限制子区域在搜索区域内 sub_search_x_start = max(sub_search_x_start, ilow); sub_search_x_end = min(sub_search_x_end, ihigh); sub_search_y_start = max(sub_search_y_start, jlow); sub_search_y_end = min(sub_search_y_end, jhigh); // 对子区域内的点进行搜索 for (int x = sub_search_x_start; x <= sub_search_x_end; x++) { for (int y = sub_search_y_start; y <= sub_search_y_end; y++) { int ii = search_area + (x - ilow) + (y - jlow) * h_length; int sad = SAD_Macroblock(ii, act_block, h_length, Min_FRAME[0]); if (sad < min_sad) { best_mv.x = x - x_curr; best_mv.y = y - y_curr; min_sad = sad; } } } } } ``` 对数搜索算法的核心思想是将搜索区域分成若干个小块,每个小块的大小为2的n次方,n为正整数。然后在每个小块内进行搜索,选择最小的SAD值对应的MV作为最终结果。通过不断缩小搜索区域的大小,可以达到较高的搜索精度和较快的搜索速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值