我正在为作业分配一些代码,其中涉及接收有序对列表,首先按升序对它们进行排序,对于相同的x值,按升序对点进行排序。我已经成功完成了任务,没有任何问题。假设我有一个排序的有序对结构数组。
我需要以有序对的形式接收来自用户的输入,并执行二进制搜索以确定用户的有序对在我的数组中是否存在。但是,我对二进制搜索的理解仅扩展到整数数组,而不是结构。
我是否需要使用二进制搜索来找到与用户具有相同x值的所有有序对,并且仅 then 在这些有序对中进行搜索匹配y值?
看看我过去为二进制搜索编写的内容,我将数组的中间部分与要搜索的内容进行了比较,但是对于有序对来说,这种比较是分散的。我不能说一个有序对“小于”或“大于”另一对,除非我将其分解。
typedef struct ordPair {
int x, y;
} point;
...
int main(void){
...
pointArray = (point*)malloc(numOfPoints * sizeof(point));
...
}
我希望搜索的输出返回地点i,其pointArray [i]等于用户提交的地点,否则它将返回-1。
答案 0 :(得分:3)
您的结构已经定义了如下顺序:
对于结构A和B:
因此,当您执行二进制搜索时,请使用上面的命令确定一个结构是否大于,小于或等于另一个结构。
答案 1 :(得分:0)
但是,我对二进制搜索的理解只扩展到整数数组,而不是结构体。
二进制搜索算法并不特定于任何特定的数据类型。它只需要对要搜索的对象进行总排序(也需要对它们进行排序),并以该顺序进行排列。您过去可能只在int
上实现了它,但是我倾向于认为,该练习的目的之一是为了推动二进制搜索算法的通用性。只要您有一种合适的方法来计算结构对对的相对顺序,它就可以与int
的结构相同,并且您可以 do ,因为您只需要这样的东西即可执行排序。
比较一下我过去为二进制搜索编写的内容 我要搜索的数组的中间,但是 比较对于有序对来说是分散的。
不,不是。您无法使用C的内置关系运算符执行比较,但这并不意味着您无法进行比较。
我怀疑您过多地关注了过去的特定实现。我希望您先学会了算法,然后再展示或诱导您发现int
的实现。问题定义了有序对的适当排序。使用它。
我不能说一个 有序对是“小于”或“大于”另一个,除非我断开 它下来。
是的,您需要查看每一对的组成,以确定哪个是“少”的。所以?只要您得到正确的答案,如何做出决定的细节就无关紧要。这绝不会影响二进制搜索的实现,而要比实现排序更(或应该做到)。确实,如果您编写了用于排序的比较函数,那么您应该能够重复使用相同的函数在二进制搜索中执行比较。
答案 2 :(得分:0)
您可以使用相同的比较函数对qsort()
的引用数组进行排序,并使用bsearch()
搜索排序的数组:
int point_cmp(const void *a, const void *b) {
const pair *aa = a;
const pair *bb = b;
if (aa->x == bb->x)
return (aa->y > bb->y) - (aa->y < bb->y);
else
return (aa->x > bb->x) - (aa->x < bb->x);
}
如果成功,您将通过从bsearch()
返回的指针中减去数组的地址来获得匹配的索引:
#include <stdio.h>
#include <stdlib.h>
typedef struct ordPair {
int x, y;
} point;
int point_cmp(const void *a, const void *b) {
const pair *aa = a;
const pair *bb = b;
if (aa->x == bb->x)
return (aa->y > bb->y) - (aa->y < bb->y);
else
return (aa->x > bb->x) - (aa->x < bb->x);
}
...
int main(void) {
size_t numOfPoints;
...
point *pointArray = malloc(numOfPoints * sizeof(point));
...
qsort(pointArray, numOfPoints, sizeof(point), point_cmp);
...
point userInput;
...
point *p = bsearch(userPoint, pointArray, numOfPoints, sizeof(point), point_cmp);
if (p != NULL) {
// point was found: compute the index
size_t found_index = p - pointArray;
...
}
...
}