标签: binary-search

优先级队列的排序列表实现的插入时间复杂度是O(n)吗?

来自维基百科

排序列表实现:就像超市的收银台一样,但重要的人可以在不太重要的人面前“插队”。(O(n) 插入时间,O(1) 下次获取时间,O(n*log(n)) 构建时间)

我认为如果用二分查找算法来查找插入位置,插入时间复杂度应该是O(log(n))。这里我把作业的到达顺序作为优先级因素。

那么是我错了还是维基百科错了?

更新:根据 TAOCP 列表的严格定义:

线性列表是 n >=0 个节点 X 1 , X[2], ... , X[n] 的序列,其基本结构属性仅涉及项目之间出现在一行中时的相对位置。

我假设维基百科引用的列表不是链接列表,它可能是数组

谢谢。

priority-queue binary-search time-complexity sortedlist

1
推荐指数
1
解决办法
8536
查看次数

告诉sql server 进行二分搜索?

我有点想以某种方式指示 sql server 使用特定算法执行搜索。

我的场景就像我有一个排序的单词列表。我将其上传到数据库表中。我想搜索表以查找该词是否存在。这就是我的要求。

sql server 是为这样的用例而设计的吗?如果没有这样的东西,我可以使用哪些选项来加快检索速度?

sql-server algorithm search binary-search

1
推荐指数
1
解决办法
1456
查看次数

如何使用 bisect 在需要时计算的数组中进行搜索

bisect.bisect_left((f(x) for x in range(pow(10, 6))), 0)
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 bisect 对满足f(x) >= 0的最小x进行二分搜索。并且 f(x) 是严格递增的。我使用二分查找的原因是因为计算 f(x) 会消耗大量资源。所以我想尽可能少地计算它。

我在这里遇到的问题是 bisect_left 中的第一个参数需要是一个列表类型,这意味着我必须为每个 x 计算 f(x)。

在这种情况下有没有办法进行二分搜索?

python binary-search

1
推荐指数
1
解决办法
154
查看次数

如何使用仅使用单词而不使用数字的二分搜索?

我被要求使用二分搜索查找我们读取的文件中的特定单词。

我不明白的问题是当您查找单词而不是数字时如何使用二分搜索。

java binary-search

1
推荐指数
1
解决办法
4952
查看次数

如何强制 data.table 将输入视为值,而不是列名?

我怎样才能让 data.table 理解,这些值是上面定义的变量而不是列名?

带有第一个注释的行应该返回 0L,但返回 dt 中包含的所有数据。

可重现的例子:

library(data.table)
dt <- structure(list(zip_from = c("1000", "1000", "1000", "1000", "1000",
"1000", "1000", "1000", "1000", "1000"), zip_to = c("1000", "1001",
"1002", "1003", "1004", "1005", "1006", "1007", "1008", "1009"
), time_1 = c(0, 332.8, 332.8, 362.5, 504.9, 256.6, 446.4, 694.4,
723.4, 462.3), dist_1 = c(0, 3208, 3208, 3465.3, 4275.5, 2267.6,
4158.1, 5811.4, 8842.6, 4624.7), dist_2 = c(0, 3208, 3208, 3465.3,
4275.5, 2267.6, 4158.1, 5811.4, 8842.6, 4624.7), time_2 = c(0,
332.8, 332.8, 362.5, 504.9, 256.6, …
Run Code Online (Sandbox Code Playgroud)

r binary-search data.table

1
推荐指数
1
解决办法
45
查看次数

最近值的二分搜索向量 C++

就像标题所说的那样,我正在尝试使用二分搜索方法来搜索排序向量中最接近的给定值并返回其索引。我尝试使用 lower/upper_bound() 但返回的值是第一个或最后一个向量值,或者“0”。下面是我已将温度和电压读入向量的 txt 文件。

1.4 1.644290    -12.5
1.5 1.642990    -13.6
1.6 1.641570    -14.8
1.7 1.640030    -16.0
1.8 1.638370    -17.1
Run Code Online (Sandbox Code Playgroud)

这是我当前有效的线性搜索

double Convert::convertmVtoK(double value) const
{
    assert(!mV.empty());
    auto it = std::min_element(mV.begin(), mV.end(), [value] (double a, double b) {
        return std::abs(value - a) < std::abs(value - b);
    });
    assert(it != mV.end());
    int index = std::distance(mV.begin(), it);
    std::cout<<kelvin[index];
    return kelvin[index];
}
Run Code Online (Sandbox Code Playgroud)

这是我目前正在努力提高性能的算法。

double Convert::convertmVtoK(double value)
{
    auto it = lower_bound(mV.begin(), mV.end(), value);

    if (it == mV.begin())
    {
        it = mV.begin();
    }
    else …
Run Code Online (Sandbox Code Playgroud)

c++ vector binary-search ifstream

1
推荐指数
1
解决办法
2327
查看次数

array.count 和 array[0 ...&lt; index] 会减慢二进制搜索的速度吗?

今天我做了一个工作测试,被要求搜索一个整数数组,这是问题:

本练习的目标是检查数组中是否存在数字。

规格:

项目是按升序排列的整数。

该数组最多可包含 100 万个项目

实现函数existsInArray(_ numbers: [Int], _ k: Int)如果k属于numbers,则返回true,否则函数应返回false

例子:

let numbers = [-9, 14, 37, 102]
existsInArray(numbers, 102) // returns true
existsInArray(numbers, 36) //returns false
Run Code Online (Sandbox Code Playgroud)

注意:尽量节省 CPU 周期

好的,所以我给出了我的答案,即下面的代码并等待结果

func existsInArray(_ numbers: [Int], _ k: Int) -> Bool {
    if numbers.isEmpty {
        return false
    }
    let numbersHalfIndex: Int = (numbers.count/2)
    if k == numbers[numbersHalfIndex] {
        return true
    } else if k != numbers[0] …
Run Code Online (Sandbox Code Playgroud)

arrays testing algorithm binary-search swift

1
推荐指数
1
解决办法
146
查看次数

二分查找程序返回错误位置

我写了一个递归程序进行二分查找,正如你看到的,我试图在给定的数组中找到目标 =21 的位置,它应该将我的位置返回为 2。但是我的输出是 1。当我调试它时,它匹配 att arr[ start]=target, 然而它直接跳转到了 findTheNumber(arr, mid + 1, end, target); 然后是下一行,然后在中间返回..只是想知道为什么我的返回在“返回开始”时中断

 package Recursion;

 public class BinarySearch {
 static int  mid = 0;

 public static int findTheNumber(int[] arr, int start, int end, int target) {


    if (arr[start] == target) {
        return start;
    }

    mid = (start + end) / 2;

    if (arr[mid] == target) {
        return mid;
    } 

    if (target >arr[mid]) {
            findTheNumber(arr, mid + 1, end, target);
        } else if (target <arr[mid]) {
            findTheNumber(arr, start, …
Run Code Online (Sandbox Code Playgroud)

java algorithm binary search binary-search

1
推荐指数
1
解决办法
54
查看次数

二分查找的时间复杂度是多少?

def binsearch(a):
    if len(a) == 1:
        return a[0]
    else:
        mid = len(a)//2
        min1 = binsearch(a[0:mid])
        min2 = binsearch(a[mid:len(a)])
        if min1 < min2:
            return min1
        else:
            return min2
Run Code Online (Sandbox Code Playgroud)

我试图提出 min1 < min2 的时间复杂度,我觉得它是 O(n) 但我不太确定它是否正确。有人可以尝试向我解释如何计算此类代码的时间复杂度吗?

python big-o binary-search time-complexity

1
推荐指数
1
解决办法
204
查看次数

是 O(NlogN) 还是 O(N^2)?

我正在尝试解决 BinarySearch.com 上的一个问题:

给定一个按升序排序的整数 nums 和一个整数 k 的列表,返回列表中的任意两个元素加起来是否为 k。您不能两次使用相同的元素。注意:数字可以是负数或 0。这应该在O(1)空格中完成。
所以对于nums = [1, 3, 5, 8]k = 6,答案应该是true

我知道它可以使用两个指针来完成,但我正在学习二进制搜索,所以我想出了以下逻辑:

bool solve(vector<int>& nums, int k) {
    for(int i=0; i<nums.size(); i++) {
        auto loc=lower_bound(begin(nums), end(nums), k-nums[i]);
        if(loc!=nums.end()) {
            if(distance(nums.begin(), loc)!=i && *loc+nums[i]==k) return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

它被接受了,但时间复杂度是多少?我不确定是O(NlogN)因为我O(logN)对 中的每个值运行二分搜索(算法)nums,还是应该是O(N^2)因为当if条件为真时,我使用distance(),据我所知,这O(n)本身就是一个操作。

c++ algorithm binary-search time-complexity

1
推荐指数
1
解决办法
133
查看次数