Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 7
1

Элемент в массиве через двоичную систему поиска

10.02.2012, 11:35. Показов 1176. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно найти элемент в массиве через двоичную систему поиска и поставить счетчик, который вычислит количество операций сравнений.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2012, 11:35
Ответы с готовыми решениями:

перевод в двоичную систему через классы
Помогите решить задачу используя классы. Дано натуральное число Р. Переведите его в двоичную...

Юникод в двоичную систему
Добрый день! Подскажите, как из файла прочитать знак (на русском языке), после чего напечатать на...

Задача на двоичную систему
Необходимо вывести в консоль все положительные четырехзначные числа, в записи которых нет 7....

Перевод в двоичную систему!
Здравствуйте, задание перевести флоат в двоичный код с мантисой порядком и всем таким, я там уже...

15
Заблокирован
Автор FAQ
10.02.2012, 17:24 2
Цитата Сообщение от Тан10шка Посмотреть сообщение
Нужно найти элемент в массиве через двоичную систему поиска и поставить счетчик, который вычислит количество операций сравнений.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
 
int getBinVal(int val)
{
    int binRew = val - 2*(val/2);
    while(0 < (val /= 2))
    {
        binRew *= 10;
        binRew += val - 2*(val/2);
    }
    //Òåïåðü "ïåðåâîðà÷èâàåì" äâîè÷íîå çåðêàëî ÷èñëà
    int binVal = binRew % 10;
    while(0 < (binRew /= 10))
    {
        binVal *= 10;
        binVal += binRew % 10;
    }
    return binVal;
}
 
int main()
{
    int * arr = 0;
    int i, n, binMask, count;
    time_t t;
    while(true)
    {
        srand(time(&t));//×òîáû îò èòåðàöèè ê èòåðàöèè ñëó÷àéíûå ÷èñëà íå ïîâòîðÿëèñü
        cout<<"Enter num of elements : ";cin>>n;
        if(!(arr = new int[n]))
            cout<<"Allocation memory error\n";
        else
        {
            count = 0;
            for(i = 0; i < n; i++)
                cout<<(arr[i] = rand()%256)<<" ";
            cout<<"\nEnter binary mask : ";cin>>binMask;
            for(i = 0; i < n; i++)
            {
                if(getBinVal(arr[i]) == binMask)
                {
                    cout<<"arr["<<i + 1<<"] = "<<arr[i]<<endl;
                    count++;
                }
            }
            delete [] arr;
        }
        arr = 0;
    }
    system("pause");
    return 0;
}
Алгоритм нахождения двоичного числа на скрине
Миниатюры
Элемент в массиве через двоичную систему поиска   Элемент в массиве через двоичную систему поиска  
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
10.02.2012, 17:28 3
Хм, желательно пояснение от ТС. Может быть имелся в виду бинарный поиск в отсортированном массиве (хотя про отсортированность не было ни слова...)?
0
-=ЮрА=-
10.02.2012, 17:36
  #4

Не по теме:

Цитата Сообщение от I.M. Посмотреть сообщение
(хотя про отсортированность не было ни слова...)?
- I.M., а откуда отсортированность вообще взялась???=-O

0
I.M.
10.02.2012, 17:41
  #5

Не по теме:

Не более, чем предположение:) Ведь если трактовать условие как "реализуйте-ка бинарный поиск", то нужно сортировать массив перед поиском.

0
-=ЮрА=-
10.02.2012, 17:44
  #6

Не по теме:

Цитата Сообщение от I.M. Посмотреть сообщение
то нужно сортировать массив перед поиском.
- =-O есть массив, есть число в двоичном представлении binMask, нужно каждый элемент массива перевести в двоичное и сравнить с binMask, вот и всё...

0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
10.02.2012, 17:57 7
Возможно, мы говорим о разных вещах, именуя их одинаково. Я говорю об этом - Бинарный поиск.
При реализации этого алгоритма актуально и другое требование ТС -
поставить счетчик, который вычислит количество операций сравнений
Т.е. счетчик выдаст число шагов, за которое алгоритм нашел искомый элемент.
Но, повторюсь, это не более, чем предположение. Вполне возможно, что вы уже верно решили поставленную задачу.
0
Заблокирован
Автор FAQ
10.02.2012, 17:58 8
Тан10шка,
Цитата Сообщение от I.M. Посмотреть сообщение
поставить счетчик, который вычислит количество операций сравнений
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
count++;
- я забыл в cout вывести
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
10.02.2012, 18:07 9
Цитата Сообщение от Тан10шка Посмотреть сообщение
Элемент в массиве через двоичную систему поиска
Здесь binary search, точно. Т.к. иначе билеберда получается.
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 7
11.02.2012, 11:36  [ТС] 10
Спасибо!!!

Проблема в том,что точного задания я так и не получила.
Но я думаю,что бинарный поиск ето именно то
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
11.02.2012, 18:07 11
Цитата Сообщение от Dani Посмотреть сообщение
Здесь binary search, точно. Т.к. иначе билеберда получается.
Если телепатические способности Dani не подвели и больше никаких уточнений не придвидится, то и так сойдёт:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/* понадобится для сортировки */
int asccmp(const void * a, const void * b){
    return *(int*)a - *(int*)b;
}
 
/* заполнение массива случайными числами */
void rndfill(int * arr, size_t size){
    while ( size-- )
        *arr++ = rand() % 10;
}
 
/* вывод на экран */
void dump(const int * arr, size_t size){
    while ( size-- )
        printf("%d%c", *arr++, ( size ) ? ' ' : '\n');
}
 
/* возвращает указатель на последнее найденное значение или NULL, counter - счётчик */
int * binsearch(const int * arr, size_t size, const int val, int * counter){
    const int * middle = arr + size / 2; /* указатель на середину массива */
    *counter += 1; /* отметились :) */
 
    if ( middle > arr ){ /* если элементов больше одного */
        if ( *(arr + size - 1) == val ) /* последний элемент */
            return (int*)(arr + size - 1);
        if ( *middle == val ) /* средний */
            return (int*)middle;
        if ( *middle > val ) /* искомый элемент между первым и средним */
            return binsearch(arr, middle - arr, val, counter);
        return binsearch(middle, size - (middle - arr), val, counter); /* в другом случае */
    }
    if ( *arr == val ) /* если нашли в начале массива */
        return (int*)arr;
        
    /* не нашли */
    return NULL;
}
 
int main(void){
    int * arr, val, * found;
    size_t size, counter;
    
    srand(time(NULL)); /* это чтобы при каждом запуске программы циферки разные были */
    
    while ( printf("Number of elements: ") && scanf("%u", &size) == 1 && size && printf("Value to search: ") && scanf("%d", &val) == 1 ){
        /* создаём и заполняем массив */
        if ( ! ( arr = (int*)malloc(sizeof(int) * size) ) ){
            perror("malloc");
            exit(1);
        }
        
        rndfill(arr, size);
        qsort(arr, size, sizeof(int), asccmp);
        printf("Array:\n");
        dump(arr, size);
        
        /* ищем элемент */
        counter = 0;
        if ( found = binsearch(arr, size, val, &counter) )
            printf("Last value %d found at pos %u with %u attempt(s)\n", val, found - arr + 1, counter);
        else
            printf("Can't find value %d after %u attempt(s)\n", val, counter);
        
        /* удаляем массив */
        free(arr);
    }
    
    exit(0);
}
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 7
11.02.2012, 19:30  [ТС] 12
Большое спасибо всем!!!!
ОООООчеьнь помогли!!!!!!!!!
0
35 / 35 / 8
Регистрация: 22.05.2010
Сообщений: 107
12.02.2012, 12:12 13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

- =-O есть массив, есть число в двоичном представлении binMask, нужно каждый элемент массива перевести в двоичное и сравнить с binMask, вот и всё...

Это самый обыкновенный ПОСЛЕДОВАТЕЛЬНЫЙ поиск
0
-=ЮрА=-
12.02.2012, 12:23
  #14

Не по теме:

vladislavchick, не занимайся офтопом...

0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
12.02.2012, 14:47 15
-=ЮрА=-, ну по сути-то он прав, это действительно последовательный поиск, да ещё и с непонятным геморроем из перевода чисел в двоичный вид. Для полноты ощущений их бы ещё в лексикографическом порядке сравнивать...

Нашёл у себя в архивах маргинальную функцию
C
1
2
3
4
int * binsearch(int val, int * arr, int cnt){
    int * middle = arr + cnt / 2;
    return ( middle > arr ) ? ( *middle > val ) ? binsearch(val, arr, middle - arr) : binsearch(val, middle, cnt + arr - middle) : ( *middle == val ) ? middle : NULL;
}
всё-таки надо проще быть...
0
-=ЮрА=-
12.02.2012, 15:09     Элемент в массиве через двоичную систему поиска
  #16

Не по теме:

Ну значит я неверно воспринял задание, ТС удовлетворилась, а больше ничего и не надо:)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2012, 15:09

Перевод в двоичную систему
Есть такой рабочий код #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; int...

Перевод в двоичную систему
Здравствуйте, написал алгоритм перевода введённого числа в двоичную систему. Проблема в том, что...

Перевод с десятичной в двоичную систему
Здравствуйте,нужно написать програму (только чистый Borland C), которая переводит числа из...

Не получается перевести в двоичную систему
Требуется перевести в двоичную систему счисления, но потом некоторые переменные меняют своё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru