Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2014, 15:00   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ромаха, ты не понял. В задании найти бинарным поиском по нескольким условиям, первое ведущее. Например: найти на шахматной доске с4. Колонка ведущая, строка ведомая. Сортируем по ключу: колонка,строка. Обрати внимание - ключ сортировки составной. И поиск по составному ключу
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.12.2014, 15:20   #12
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Бинго! Дошло!
Нечто вида списка ребер, но с доп. полям, чтобы многократно крутить поиск.. Спасибо!!!
Poma][a вне форума Ответить с цитированием
Старый 16.12.2014, 15:28   #13
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Можете объяснить как надо переделать код?
Я мало что понял из того что выше...

Допустим создаю я массив структур.

Код:
struct st
{
   int x;
};

st y[15];
Что мне с ним делать?
Как я уже понял искомых ключей должно быть несколько? и это созданный мною массив?
Я что-то совсем запутался

До всех короче дошло кроме меня

Последний раз редактировалось Stilet; 16.12.2014 в 17:17.
Praud вне форума Ответить с цитированием
Старый 16.12.2014, 17:15   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что мне с ним делать?
Использовать в условии, где сейчас у тебя
Цитата:
if (arr[j] > arr[j + 1])
Т.е.
Код:
if (y[j].x>y[i].x && y[j].ДругоеПоле>y[j].ДругоеПоле)
Получается сортировка по двум условиям - х и ДругоеПоле
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.12.2014, 17:32   #15
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Так мне же нужна не сортировка по нескольким условиям, а поиск!

Я забабахал вот такой вот код.

Код:
#include <iostream>
#include <locale.h>
#include <time.h>
using namespace std;

const int N = 5; 
const int COUNT = 3;

struct Table
{
	int x;
	int y;
};

int BinarySearch(Table[], int); //  Дихотомический поиск 
void BubbleSort(Table[]); // Пузырьковая сортировка

int main()
{
	setlocale(LC_ALL, "Rus"); // Русский язык в консоли

	srand(time(NULL)); 

	Table st[N];
	int keys[COUNT];

	for (int i = 0; i < N; i++)
	{
		st[i].x = 0 + rand() % 10; // Заполняем массив случайными числами
		st[i].y = 0 + rand() % 10; // Заполняем массив случайными числами
	}

	BubbleSort(st); // Сортируем массив по возрастанию

	cout << "Исходная таблица:" << endl;

	for (int i = 0; i < N; i++)
		cout << st[i].x << " ";  // Выводим массив в консоль
	
	cout << endl;

	for (int i = 0; i < N; i++)
		cout << st[i].y << " ";  // Выводим массив в консоль

	cout << endl;
	cout << "Введите ключи: " << endl;
	
	for (int i = 0; i < COUNT; i++)
	{
		cout << i + 1 << ") ";
		cin >> keys[i]; // Запрос ключа
	}
	
	for (int i = 0; i < COUNT; i++)
	{
		if (BinarySearch(st, keys[i]) != -1)
			cout << "Ключ " << keys[i] << " найден" << endl;
		else cout << "Ключ " << keys[i] << " не найден" << endl;
	}
	

	cout << endl;
	system("pause");
}

// Бинарный поиск
int BinarySearch(Table t[], int key)
{
	int l = t[0].x;  // нижняя граница
	int u = t[N -1].x;    // верхняя граница

	while (l <= u) 
	{
		int m = (l + u) / 2;  // средний элемент
		if (t[m].x == key) return m;
		if (t[m].x < key) l = m + 1;
		if (t[m].x > key) u = m - 1;
	}

	l = t[0].y;  // нижняя граница
	u = t[N - 1].y - 1;    // верхняя граница

	while (l <= u)
	{
		int m = (l + u) / 2;  // средний элемент
		if (t[m].y == key) return m;
		if (t[m].y < key) l = m + 1;
		if (t[m].y > key) u = m - 1;
	}

	return -1;
}

// Пузырьковая сортировка
void BubbleSort(Table t[])
{
	int temp;

	for (int i = 0; i < N - 1; i++)
		for (int j = 0; j < N - i - 1; j++)
			if (t[j].x > t[j + 1].x)
			{
				temp = t[j].x;
				t[j].x = t[j + 1].x;
				t[j + 1].x = temp;
			}

	for (int i = 0; i < N - 1; i++)
		for (int j = 0; j < N - i - 1; j++)
			if (t[j].y > t[j + 1].y)
			{
				temp = t[j].y;
				t[j].y = t[j + 1].y;
				t[j + 1].y = temp;
			}
}
При чем он у меня еще и через раз работает.
Комменты старые, можно не читать.
Что тут происходит щас расскажу...

Вводим массив ключей
"В качестве исходных данных рассматривать массив числовых ключей."

Сортируем массив структур одним махом.
Вначале поля x, затем y.

Далее ищем наши ключи в таблице и показываем какие есть, каких нет.

Это бред сумасшедшего, да ?
Изображения
Тип файла: jpg Безымянный.jpg (15.7 Кб, 107 просмотров)

Последний раз редактировалось Stilet; 16.12.2014 в 18:53.
Praud вне форума Ответить с цитированием
Старый 16.12.2014, 17:38   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Так мне же нужна не сортировка по нескольким условиям, а поиск!
А бинарный поиск не бывает без сортировки, хоть по однму условию, хоть по нескольким
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.12.2014, 18:55   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это бред сумасшедшего, да ?
Ну я бы не сказал что бред, но пожалуй допилить его стоит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.12.2014, 19:08   #18
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Можете помочь определить где у меня ошибка в коде?
Сортирует нормально, а вот поиск через раз работает правильно.
Praud вне форума Ответить с цитированием
Старый 16.12.2014, 20:57   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я может сейчас неправильно напишу, но все же:
Код:
// Бинарный поиск
int BinarySearch(Table t[], int key)
{
	int l=0;  // нижняя граница
	int u = N;    // верхняя граница
        int i=N/2;
	while (l <= u) 
	{
		if (t[i].x == key) return m; else
		if (t[i].x < key) l = l+(u-l)/2;  else
		if (t[i].x > key) u =u-(u-l)/2;  
                i=(u-l)/2;
	}

	return -1;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.12.2014, 21:24   #20
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я может сейчас неправильно напишу, но все же:
Код:
// Бинарный поиск
int BinarySearch(Table t[], int key)
{
	int l=0;  // нижняя граница
	int u = N;    // верхняя граница
        int i=N/2;
	while (l <= u) 
	{
		if (t[i].x == key) return m; else
		if (t[i].x < key) l = l+(u-l)/2;  else
		if (t[i].x > key) u =u-(u-l)/2;  
                i=(u-l)/2;
	}

	return -1;
}
return m?
и программа зависает, когда элемент не находится

P.S потестил, даже не всегда находит

Последний раз редактировалось Praud; 16.12.2014 в 21:28.
Praud вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в доработке программы на языке паскаль (бинарный поиск, поиск перебором) DimzNOVIchok45 Помощь студентам 0 13.10.2014 20:11
Реализовать два метода поиска строк в массиве: поиск перебором, бинарный поиск на языке Pascal DimzNOVIchok45 Помощь студентам 7 19.09.2014 21:40
Бинарный поиск. Bezukhoff Помощь студентам 0 16.03.2012 03:34
Бинарный поиск CraZZZy-GameRRR Общие вопросы Delphi 8 25.05.2010 14:57