Как работает M-блочный поиск?
Как реализовать м-блочный поиск в массиве на С? Я перерыл пол-рунета и нашел только краткое описание, и то, оно кругом одинаковое.
Источник: Stack Overflow на русском
Как реализовать м-блочный поиск в массиве на С? Я перерыл пол-рунета и нашел только краткое описание, и то, оно кругом одинаковое.
Согласен с автором, ужас какой-то, все копируют текст из книжек "Громов Ю.Ю., Татаренко С.И. Программирование на языке СИ" и считают это ответом на вопрос =)
Вот алгоритм из моей домашней библиотеки =)
/*
M-блочный поиск. Предполагается, что исходный упорядоченный
(отсортированный) массив B длины N разбит на M подмассивов B1, B2,
..., BM длин N1, N2, ..., NM, таким образом, что B={ B1, B2 , .., BM}.
Для нахождения ключа V, нужно сначала определить первый из списков Bi,
i=1,M, последний элемент которого больше V, а потом применить
последовательный поиск к списку Bi.
*/
#include<stdio.h>
void main()
{
int i, a[100], b[100], j, s = 0, k, x, z;
int t;
for (i = 0; i < 100; i++)
a[i] = 0, b[i] = 0;
// Ввод массива (упорядоченного!)
for (i = 0;; i++)
{
printf("Enter A:");
scanf("%d", &a[i]);
if (a[i] == -1)
break;
}
// Ввод длинн подмассивов
for (j = 0;; j++)
{
printf("Enter LEN");
scanf("%d", &b[j]);
if ((s += b[j]) >= i)
break;
}
printf("Find:");
scanf("%d", &x);
j = 0;
// printf("%d %d %d\n", k, a[k], b[j-1]);
for (k = b[j++] - 1; (a[k] < x) && (k <= i); k += b[j++]) ;
if (k > i) {
printf("Error");
return;
}
for (z = k - b[j - 1]; (z <= k); z++) {
if (a[z] == x) {
printf("Number:%d\n", z);
break;
}
}
if (z >= k)
printf("Not found\n");
}