我刚刚开始了一个学校项目,那个项目我需要使用Linked List。另外,我需要搜索链接列表中的一些数据。
我一直在研究搜索算法。 我看了看:
Binary Search
(递归的) - 看起来难以实现 -
Sequential Search
- 复杂性已经是O(N)
Exponential Search
- 基于二进制搜索 -
我可以以最有效的方式使用哪种算法?此外,搜索算法的复杂性必须低于 O(N)。我愿意接受任何建议
我的作业详情: 他们希望我们在控制台上编写基本的facebook。它会做添加朋友,阻止朋友,喜欢那些东西。
将链接列表并包含姓名,姓氏,性别和出生日期。此外,这些数据将来自文件。在将数据加载到链接列表之前,它将被排序,然后将加载到链接列表。
作业有5个主干功能:插入(基本上将人员添加到链接列表并对其进行排序),搜索(搜索特定人员并说复杂性必须为O(logN) ),打印,阻止人并打印被屏蔽的人,
编辑: 我认为这是一种二元搜索:
我将二进制搜索称为searchFriends(FList, 0, FList->size - 1);
searchFriends内部:
void searchFriends(List FList, int l, int r)
{
if (r - 1 >= 1)
{
int middleItem = l + (r - 1) / 2;
struct Node* temp = FList->head->next;
int i = 0;
while (i < middleItem)
{
temp = temp->next;
i++;
}
if (strcmp(temp->Name, "Name") == 0)
{
printf("\nName\t\tSurname\t\tGender\t\tBirth Year\n");
printf("%-15s %-15s %-15c %s\n", temp->Name, temp->Surname, temp->Gender, temp->DateofBirth);
}
if (strcmp(temp->Name, "Name") > 0)
return searchFriends(FList, l, middleItem - 1);
return searchFriends(FList, middleItem + 1, r);
}
}
答案 0 :(得分:3)
请注意,标准链表是不随机访问。遍历此类列表的唯一方法是线性的。
因此,不可能在链表上使用二进制搜索等随机访问算法。您必须执行顺序==线性搜索,最坏情况复杂度为O(n)。