- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定一个输入(值 1),我需要在 vector (“vec”)中找到它的上限。我需要返回指向此上限值的指针,而不是返回上限值。
vector<int> vec;
vec.push_back(5); vec.push_back(7); vec.push_back(15);
如果我的输入值 1="13",那么我的函数 upperBound() 应该返回指向元素 15 的指针。
upperBound() 函数返回“pointerUpperBound”——它是指向 value1 上限的指针。
在我的例子中,上限是指大于或等于输入值 (value1) 的值。是大于输入的最小数
//**GOAL OF ALGORITHM: Given "value1" it needs to find value1's upper bound in vector "vec". Instead of return the upper bound element, I need to return pointer to upper bound element**
bool upperBound(int* &pointerUpperBound,int value1, vector<int> vec)
// Perform a binary search
{
unsigned left=0,right=(vec.size()-1);
int* l=&vec[0];
int* r=(l+vec.size()-1); //l will be start of pageInfo vector and r will be end of page info vector
if(vec.size()==1) //vec has just one element in it.
{
pointerUpperBound=l;
return true;
}
while (left!=right) {
int* pointerUpperBound=l+((r-l)/2);
unsigned middle=left+((right-left)/2);
if(value> (*pointerUpperBound)) {
l=pointerUpperBound+1;
left=middle+1;
} else if (!middle) { //reached the upper bound, it is "pointerUpperBound" which is also returned.
break;
} else {
int* prev=pointerToUpperBound;
prev--;
if(value1 > (*prev)) {
break;
} else{
right=middle;
r=pointerToUpperBound;
}
}
}
// Unsuccessful search?
if (left==right) {
return false;
}
}
我的算法没有返回正确的上限。谁能帮我弄清楚我哪里出错了。
我只想使用“指针”遍历这个 vector 。我不想使用内置函数来查找上限——因为我想了解我的算法哪里出错了。
最佳答案
您没有仔细考虑请求值大于 vector 中任何值的情况,并且通过忽略该情况,您也弄错了其他情况。
您没有发布您测试的真实代码,因为:
int* pointerUpperBound=l+((r-l)/2);
unsigned middle=left+((right-left)/2);
if(value> (*pointerUpperBound)) {
l=m+1;
什么是 m
??
所有这些多余的工作(并行的指针和未签名的拷贝)只是困惑的根源。使用一个或另一个。
考虑一下您的代码(在您进行上述更正之后):
if(value> (*pointerUpperBound)) {
l=pointerUpperBound+1;
left=middle+1;
}
如果value > *r
上面的代码可以到达l=r+1;
那是你打算为那个案子做的吗?如果不是,您的意图是什么?
您认为您在决赛中报道的是什么案例?
// Unsuccessful search?
if (left==right) {
return false;
}
想想r==l+2
的情况你想要的答案是r
.你试试位置l+1
它太小了,所以你设置l=l+1+1;
永远不要尝试那个位置,因为它是 r
但你只需结束循环并返回 false
.你从胜利的嘴里抢走了失败。
bool upperBound(int* &pointerUpperBound,int value1, vector<int> vec)
// Perform a binary search
{
int* l=&vec[0]; // Pointer to lowest that might be == value1
int* r=l+vec.size(); //Pointer PAST last value that might be < value1
while ( l < r ) {
int* m=l+((r-l)/2); // Notice m<r, m>=l
if( value1 > *m ) {
l=m+1; // l always increases here
} else {
r=m; // m always decreases here
}
}
pointerUpperBound = l; // first position >= value1
}
代码真的很简单。边界案例值得思考,但我认为它们都能解决。如果 vector 中的每个项目 < value1,此代码返回超过 vector 末尾的第一个位置。这是一个设计选择(不是对或错)。如果您不喜欢该选择,应该很容易更改。
在任何二分搜索中,你需要注意它总是收敛,永远不会陷入一个不改变的循环 l
或 r
什么时候r==l+1
.这是二进制搜索中一个非常普遍的缺陷,我在代码中评论了我认为它不会发生的原因。
那么您需要精确定义哪里l
和 r
点以查看边界情况是否安全。 l
仅传递元素 <value1
所以我们仍然确定它不会传递可能 ==value1
的第一个元素. r
备份项目不是 <value1
所以它可能会跨项目备份 ==value1
所以在多个项目匹配的边界情况下 value1
我们似乎找到了第一个。这是一个意外的“设计选择”,您可能愿意也可能不愿意更改。但除此之外,我们至少会看到 r
从不备份项目 <value1
关于c++ - 使用二进制搜索搜索 vector 的上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34471603/
我正在尝试将谷歌地图集成到 Xamarin Android。但是,如标题中所写,收到错误。此错误出现在我的 SetContentView (Resource.Layout.Main); 上,如下所示:
在 Delphi 中如何以非文本模式打开二进制文件?类似于 C 函数 fopen(filename,"rb") 最佳答案 有几个选项。 1。使用文件流 var Stream: TFileStrea
我现在正在处理一个问题,如下所示: 有两个数字 x1 和 x2 并且 x2 > x1。 例如 x1 = 5; x2 = 10; 而且我必须在二进制表示中找到 x1 和 x2 之间的总和。 5 = 10
我有这个“程序集”文件(仅包含 directives ) // declare protected region as somewhere within the stack .equiv prot_s
有没有办法在powershell中确定指定的文件是否包含指定的字节数组(在任何位置)? 就像是: fgrep --binary-files=binary "$data" "$filepath" 当然,
我是一名工程师,而不是软件程序员,所以请原谅我的无知。 我编写了一个 Delphi(7SE) 程序,用于从连接到两个数字温度计的 USB 端口读取“真实”数据类型。 我已经完成了该计划的大部分内容。
我有一些代码,例如: u=(float *)calloc(n, sizeof(float)); for(i=1; i
typedef struct pixel_type { unsigned char r; unsigned char g; unsigned char b;
如何判断二进制数是否为负数? 目前我有下面的代码。它可以很好地转换为二进制文件。转换为十进制时,我需要知道最左边的位是否为 1 以判断它是否为负数,但我似乎无法弄清楚该怎么做。 此外,我如何才能让它返
我有一个带有适当重载的 Vect*float 运算符的 vector 类,我正在尝试创建全局/非成员 float*Vect 运算符,如下所示:(注意这是一个经过大量编辑的示例) class Vect
对于使用 C 编程的项目,我们正在尝试将图像转换为二进制数据,反之亦然。我们在网上找到的所有其他解决方案都是用 C++ 或 Java 编写的。这是我们尝试过的方法: 将图像转换为包含二进制数据的文本文
我需要对列表的元素求和,其中包含所有零或一,如果列表中有 1,则结果为 1,否则为 0。 def binary_search(l, low=0,high=-1): if not l: retu
我到处搜索以找到将 float 转换为八进制或二进制的方法。我知道 float.hex 和 float.fromhex。是否有模块可以对八进制/二进制值执行相同的工作? 例如:我有一个 float 1
当我阅读有关 list.h 文件中的 hlist 的 FreeBSD 源代码时,我对这个宏感到困惑: #define hlist_for_each_entry_safe(tp, p, n, head,
我不知道出了什么问题,也不知道为什么会出现此错误。我四处搜索,但我终究无法弄明白。 void print_arb_base(unsigned int n, unsigned int b) {
在任何语言中都可以轻松地将十进制转换为二进制,反之亦然,但我需要一个稍微复杂一点的函数。 给定一个十进制数和一个二进制位,我需要知道二进制位是开还是关(真或假)。 示例: IsBitTrue(30,1
在下面的代码中,我创建了两个文件,一个是文本格式,另一个是二进制格式。文件的图标显示相同。但是这两个文件的特征完全相同,包括大小、字符集(==二进制)和流(八位字节)。为什么没有文本文件?因为如果我明
我想通读一个二进制文件。谷歌搜索“python binary eof”引导我here . 现在,问题: 为什么容器(SO 答案中的 x)不包含单个(当前)字节而是包含一大堆字节?我做错了什么? 如果应
为什么只允许以 10 为基数使用小数点?为什么以下会引发语法错误? 0b1011101.1101 我输入的数字是否有歧义?除了 93.8125 之外,字符串似乎没有其他可能的数字 同样的问题也适用于其
boost 库中有二进制之类的东西吗?例如我想写: binary a; 我很惭愧地承认我曾尝试找到它(Google、Boost)但没有结果。他们提到了一些关于 binary_int<> 的内容,但我既
我是一名优秀的程序员,十分优秀!