标签: binary-search

BinarySearch没有预期的结果

我使用xpath从xml文件填充了一个排序的日期列表(以dd/mm/yyyy格式存储为字符串).

但是,当查询列表以查看列表中是否存在日期时,我总是得到否定结果(即不存在),即使我有查询字符串的硬编码以匹配列表中的日期.

但是,当对包含查询字符串的索引进行字符串比较时,我得到0表示字符串是相同的.

什么可以导致这种奇怪的行为?

这里要求的是代码

假期包括:

while (iter.MoveNext())
{
    XPathNavigator nav2 = iter.Current;
    XPathNodeIterator iter2 = nav2.SelectDescendants("date", "", false);
    while (iter2.MoveNext())
    {
        date = iter2.Current.ToString();
        holidays.Add(date);
    }
}

return holidays;
Run Code Online (Sandbox Code Playgroud)

搜索是:

holidays = list.getHolidays();
if(holidays.BinarySearch(DateTime.Now.ToShortDateString()) > 0)
Run Code Online (Sandbox Code Playgroud)

返回以下XML:

<date>01/01/2009</date>
<date>25/02/2009</date>
<date>10/04/2009</date>
<date>13/04/2009</date>
<date>04/05/2009</date>
<date>25/05/2009</date>
<date>31/08/2009</date>
<date>25/12/2009</date>
<date>28/12/2009</date>
Run Code Online (Sandbox Code Playgroud)

.net c# binary-search

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

二进制搜索

所以,我想更多地了解二进制搜索,因为我真的不明白.二进制搜索需要一个数组排序的前提条件.我做对了吗?看起来一个方法应该检查这个前提条件并在不满足时抛出异常.但是,为什么检查前提条件是个坏主意?

algorithm search binary-search preconditions

3
推荐指数
2
解决办法
1980
查看次数

Python二进制搜索类函数,用于查找排序列表中第一个大于特定值的数字

我正在尝试在Python中编写一个函数,它找到排序列表中的第一个数字,该数字大于我作为参数传递的特定值.我在网上找到了使用简单列表推导来实现这一目的的例子,但出于我的目的,我需要经常在大型列表上执行此操作,因此在线性时间内运行的搜索过于昂贵.

虽然我遇到了一些无法正常工作的边缘情况,但我在编写迭代二进制搜索类函数时遇到了麻烦.顺便说一下,该功能不需要处理列表中没有较大项目的情况.这是我现有的功能:

def findFirstLarger(num, sortedList):
    low = 0; 
    high = len(sortedList) - 1

    mid = -1
    while True:
        print("low: " + str(low) + "\t high: " + str(high))
        if (low > high):
            print("Ah geez, low is " + str(low) + " and high is " + str(high))
            return # debugging, don't want this to happen
        if low == high:
            return sortedList[low]
        else:
            mid = (low + high) / 2;
            if num == sortedList[mid]:
                return sortedList[mid]
            elif num > sortedList[mid]:
                low …
Run Code Online (Sandbox Code Playgroud)

python binary-search

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

在我搜索的字段上排序后,我可以更快地搜索已排序的List <T>吗?

我认为List<T>在我搜索的字段上排序会使搜索更快.假设我在对象模型中有List<Person>10.000和List<Car>10.000.我循环模型中的人员列表,并希望找到具有属性c.Owner == person.Name的Car.

public static Car Car(Model model, Person person)
        {
            return model.Cars.Find(
                 delegate(Car c)
                 {
                     return c.Owner.Equals(person.Name);
                 });
        }
Run Code Online (Sandbox Code Playgroud)

对财产所有者的汽车列表进行排序不会使循环更快?

我想也许我应该使用,BinarySearch但重载BinarySearch不允许代表.BinarySearch当您必须将要查找的汽车作为参数进行查询时,überhaupt的用途是什么?

c# sorting find binary-search

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

O(n log(n))算法,检查int []中给定数字的2个数的和

我应该创建一个O(n log(n))算法,检查int [] ==给定数字中是否有2个数字的总和.

例如.鉴于[1,4,7,2,3,4]将有8(1 + 7)而不是20

给出的答案建议使用二进制排序或合并排序,但他们只给出了合并排序算法,而没有逻辑处理这个特殊要求.然后另一个答案是:

假设x是我们要检查的总和,z是此数组中的元素集:以下算法解决了以下问题:

  1. 在S中排序元素
  2. 形成集合S'= {z:z = x-y表示某些y∈S}.
  3. 对S'中的元素进行排序.
  4. 如果S中的任何值出现多次,则删除除一个实例外的所有值.为S'做同样的事情.
  5. 合并两个有序集S和S'.
  6. S中存在两个元素,当且仅当相同的值出现在合并输出的连续位置时,其总和才是x.

为了证明步骤4中的声明的合理性,首先观察如果在合并输出中出现两次任何值,它必须出现在连续的位置.因此,我们可以在步骤5中重述该条件,因为在S中存在两个元素,当且仅当相同的值在合并输出中出现两次时,其总和恰好为x.假设某个值w出现两次.然后在S中出现一次,在S'出现一次.因为w出现在S'中,所以存在一些y∈S,使得w = x-y,或x = w + y.由于w∈S,元素w和y在S中并且与x相加.

相反,假设存在值w,y∈S使得w + y = x.然后,由于x-y = w,值w出现在S'中.因此,w在S和S'中,因此它将在合并输出中出现两次.

步骤1和3需要O(n log n)步骤.步骤2,4,5和6需要O(n)步骤.因此总运行时间为O(n log n).

但我真的不是他们的意思.在第2步中,x和y是什么?

但是我自己在下面创建,我想知道它是O(n log(n))不是?

class FindSum {

  public static void main(String[] args) {
    int[] arr = {6,1,2,3,7,12,10,10};
    int targetSum = 20;

    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
    int end = arr.length - 1;
    if (FindSum.binarySearchSum(arr, targetSum, 0, end, 0, end)) {
      System.out.println("Found!");
    } else …
Run Code Online (Sandbox Code Playgroud)

java big-o binary-search

3
推荐指数
2
解决办法
6292
查看次数

具有三个参数的C++递归二进制搜索

我99%肯定我的问题是我每次开始都设置为低至零.但我不知道如何保持低一致代表低指数,无论我的递归深度.如果它准确地告诉我低指数的指数我不认为我会有问题.

到目前为止,这是我的代码:

int recBSearch(vector<int> v, int size, int item)
{
    int index = size / 2;
    int curr = v[index];
    int low = 0;
    int high = size -1;
    if (v[index] == item)
        return index;
    else if (v[index] > item)
    {
        high = index;
        index = (high+low)/2;
        size = high - low;
        return recBSearch(v, size, item);
    }
    else if (v[index] < item)
    {
        low = index;
        index = (high+low)/2;
        size = high - low;
        return recBSearch(v, size, item);
    }
    return …
Run Code Online (Sandbox Code Playgroud)

c++ parameters binary-search

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

BinarySearch如何在两个邻居之间找到数组中的值?

我有一个排序数组double.目标是在Array中查找索引.其中包含<=搜索值的值.

例如,数组包含{0, 5, 12, 34, 100}索引范围为[0 .. 4]的数字.

搜索值= 25.我想得到指数= 2(出现的范围在12到34之间)

我不明白在这种情况下如何运行二进制搜索.

   public class MyComparer : IComparer<double>
    {
        public int Compare(double x, double y)
        {
            //<-------- ???
        }
    }

    public double[] spline_x;

    MyComparer cmpc = new MyComparer();
    int i=Array.BinarySearch(spline_x, x, cmpc);
Run Code Online (Sandbox Code Playgroud)

c# arrays algorithm find binary-search

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

多图的时间复杂性问题

我创建了一个程序来查找数字列表的中位数.数字列表是动态的,可以删除和插入数字(可以输入重复的数字),在此期间,重新评估和打印新的中位数.

我使用multimap创建了这个程序,因为

1)它已经被分类的好处,
2)容易插入,删除,搜索(因为多图实现二进制搜索)
3)允许重复的条目.

条目数+删除数(表示为N)的约束是:0 <N <= 100,000.

我写的程序工作并打印出正确的中位数,但速度不够快.我知道unsorted_multimap比multimap快,但是unsorted_multimap的问题是我必须对它进行排序.我必须对它进行排序,因为找到你需要有一个排序列表的中位数.所以我的问题是,使用unsorted_multimap然后快速排序条目是否可行,或者这只是荒谬的?使用矢量,快速导航矢量和使用二分搜索会更快吗?或者也许我忘记了一些我甚至都没想过的神话般的解决方案.

虽然我不是C++的新手,但我会承认,我的时间复杂性技巧在某种程度上是医学上的.


我越是看自己的问题,我越开始认为只使用带快速排序和二进制搜索的向量会更好,因为数据结构基本上已经实现了向量.

c++ big-o binary-search multimap time-complexity

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

二叉树中的叶子数量

我是二叉树的初学者,并且一直在通过算法书.我已经了解了BST的各种遍历方法(预订,后期订单等).

有人可以解释一下如何通过BST来计算离开的节点数(没有孩子)吗?

非常感谢!

algorithm binary-search binary-search-tree

3
推荐指数
2
解决办法
8208
查看次数

使用递归的二进制搜索函数根

我正在尝试编写二进制搜索函数来查找fun区间中函数的根[,]:

这是我所拥有的,但却遗漏了标记:

def binarySearchIter(fun, start, end,  eps=1e-10):
    '''
    fun: funtion to fund the root
    start, end: the starting and ending of the interval
    eps: the machine-precision, should be a very small number like 1e-10

    return the root of fun between the interval [start, end]
    '''

    root = (start + end)/2
    print(root)

    answer=fun(root)

    if abs(answer) <= eps:
        print(root)
        return root
    elif answer - eps > 0:
        binarySearchIter(fun, start, root, eps=1e-10)
    else:
        binarySearchIter(fun, root, end,  eps=1e-10)
Run Code Online (Sandbox Code Playgroud)

这是我用来测试的功能:

def …
Run Code Online (Sandbox Code Playgroud)

python recursion binary-search python-3.x

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