powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как найти число
74 сообщений из 74, показаны все 3 страниц
Как найти число
    #36078327
alusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите правильный алгоритм. Дан массив размера N из целых чисел, принимающих значения от 1 до M, при этом одно число в этом массиве повторяется два раза.
Как найти число за наименьшее время.
...
Рейтинг: 0 / 0
Как найти число
    #36078374
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отсортировать массив, тогда одинаковые числа будут идти подряд.
...
Рейтинг: 0 / 0
Как найти число
    #36078628
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать битовую карту, если диапазон целых чисел невелик.
...
Рейтинг: 0 / 0
Как найти число
    #36078662
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, битовая карта слишком дорого, проще сортировка подсчетом
...
Рейтинг: 0 / 0
Как найти число
    #36078682
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedmayton, битовая карта слишком дорого, проще сортировка подсчетом
Обоснуй
...
Рейтинг: 0 / 0
Как найти число
    #36078711
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton пишет:

> mayton, битовая карта слишком дорого, проще сортировка подсчетом
>
>
> Обоснуй

Вы похоже совсем зарапортовались. Какая сортировка?
Сортировка -- это уже O( N log N ) А тут решается
за линейное время O( N ) всё. За один просмотр массива.

А я кстати этот вопрос знаю. И знаю, где его задают.
Posted via ActualForum NNTP Server 1.4

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
Как найти число
    #36078724
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА я кстати этот вопрос знаю. И знаю, где его задают.Этот вопрос много где задают.
Известный баян, на sql.ru частенько встречался.
...
Рейтинг: 0 / 0
Как найти число
    #36078788
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗа один просмотр массива

Что, и для случая когда шаг между двумя последовательными числами в ОТСОРТИРОВАННОЙ последовательности от 1 до М является совершенно случайной величиной? Было б интересно взглянуть на такое решение. Не томи, покажь
...
Рейтинг: 0 / 0
Как найти число
    #36078855
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_n,

А причем тут "шаг между двумя последовательными числами в ОТСОРТИРОВАННОЙ последовательности"?
Главное, чтобы памяти хватило на массив размера M бит, а шаг между числами, имхо, никакой роли не играет.
...
Рейтинг: 0 / 0
Как найти число
    #36078875
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

сказано уже было - массив целых чисел. Памяти на это надо для int32 чуть больше полугигабайта.
...
Рейтинг: 0 / 0
Как найти число
    #36078885
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторГлавное, чтобы памяти хватило на массив размера M бит, а шаг между числами, имхо, никакой роли не играет.

Ну, с использованием доп. памяти - ни вапрос. Но я так понял что Зив знает как получить результат не используя дополнительные массивы.
...
Рейтинг: 0 / 0
Как найти число
    #36079025
гдеже?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
А я кстати этот вопрос знаю. И знаю, где его задают.


И где, если не секрет?
...
Рейтинг: 0 / 0
Как найти число
    #36079216
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гдеже? пишет:

> И где, если не секрет?

Не скажу.

На счёт дополнительной памяти -- дело не в её наличии,
а в скорости поиска по этой дополнительной структуре.
Если её делать линейной, то результат работы всего
алгоритма будет O(N**2). Если логарифмической, то
будет O( N*log N ). А в идеале можно сделать за O( N ).
Вот как -- и думайте. посмотрим, какие вы джедаи
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36079342
гдеже?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
#pragma warning (disable: 4786 )
#include <iostream>
#include <vector>
#include <algorithm>


using namespace std;

int main(){

	int n;
	cin >> n;
	vector<int> arr;

	int temp;
	for ( int i =  0 ; i < n; i++ ){
		cin >> temp;
		arr.push_back(temp);
	}

	vector<int>::iterator iter;
	
/*	for ( iter = arr.begin(); iter != arr.end(); ++iter )
		cout << *iter << " ";
	cout << endl;
*/
	vector<int>::const_iterator iterScnd;
	bool found = false;
	for ( iter = arr.begin(); iter != arr.end(); ++iter ){
		for ( iterScnd = iter +  1 ; iterScnd != arr.end(); ++iterScnd )
			if ( *iterScnd == *iter ){
				cout << *iter << endl;
				found = true;
				break;
			}
		if ( found )
			break;
	}
	

	return  0 ;
}


Чисто хз, на скорую руку, в анализе не силен(
...
Рейтинг: 0 / 0
Как найти число
    #36079354
Экзамен в школу падаванов? Забавно =)
...
Рейтинг: 0 / 0
Как найти число
    #36079360
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alusovПодскажите правильный алгоритм. Дан массив размера N из целых чисел, принимающих значения от 1 до M, при этом одно число в этом массиве повторяется два раза.
Как найти число за наименьшее время.
Вспоминается похожая прикольная задачка, где "Дан массив размера M+1 из целых чисел, принимающих значения от 1 до M, при этом одно число в этом массиве повторяется два раза..."
...
Рейтинг: 0 / 0
Как найти число
    #36079366
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока еще садик.
...
Рейтинг: 0 / 0
Как найти число
    #36079450
гдеже?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
через set в STL?
...
Рейтинг: 0 / 0
Как найти число
    #36079469
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гдеже? пишет:

> bool found = false;
> for ( iter = arr.begin(); iter != arr.end(); ++iter ){
> for ( iterScnd = iter + *1*; iterScnd != arr.end(); ++iterScnd )
> if ( *iterScnd == *iter ){
> cout << *iter << endl;
> found = true;
> break;

> Чисто хз, на скорую руку, в анализе не силен(

Это -- O( N**2 ), это не интересно, а интересно O( N ).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36079613
Случайно к вам попал =)
Но прям даже интересно стало. А как оцените такой код? Это джава, пугаться не надо.

final int ELEMENTS_COUNT = 100000;
int doubleValue = -1;
int[] array = new int[ELEMENTS_COUNT];
Set set = new HashSet<Integer>();
for(int i = 0; i<ELEMENTS_COUNT-1; i++){
array[i] = i;
}
array[ELEMENTS_COUNT-1] = 1;
int size = set.size();
long startTime = System.currentTimeMillis();

// Все интересное тут:

for(int i = 0; i<100000; i++){
set.add(array[i]);
int s;
if((s = set.size()) == size){
doubleValue = array[i];
break;
}else{
size = s;
}
}



long endTime = System.currentTimeMillis();
System.out.println("Works: " + (endTime - startTime) + ", value: " + doubleValue);
...
Рейтинг: 0 / 0
Как найти число
    #36079623
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНа счёт дополнительной памяти -- дело не в её наличии,
а в скорости поиска по этой дополнительной структуре.
Если её делать линейной, то результат работы всего
алгоритма будет O(N**2). Если логарифмической, то
будет O( N*log N ). А в идеале можно сделать за O( N ).
Вот как -- и думайте. посмотрим, какие вы джедаи
а чего думать-то? mayton еще с самого начала сказал про битовую карту, про что Вы сами сказали "решается за линейное время O( N )" (если я правильно понял цитирование).
...
Рейтинг: 0 / 0
Как найти число
    #36079647
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень юный падаванСлучайно к вам попал =)
Но прям даже интересно стало. А как оцените такой код? Это джава, пугаться не надо.

for(int i = 0; i<100000; i++){
set.add(array[i]);
Зависит от структуры хранения set и от внутренней реализации add. Перепишите этот момент алгоритмически, чтобы было понятно тем, кто джаву не знает.
...
Рейтинг: 0 / 0
Как найти число
    #36079680
Смысл множества - хранение объектов в единственном экземпляре, реализовано через хеш-функцию (в данном случае). Скорость выполнения операций добавления и получения размера фиксирована (какова она - зависит от вашей машины, сколько там операций - сказать не берусь, так глубоко не копал). Смысл в том, что бы проверить, увеличится ли размер множества, если добавить туда элемент массива. Если такой элемент был добавлен раньше - не увеличится.
...
Рейтинг: 0 / 0
Как найти число
    #36079693
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень юный падаванСкорость выполнения операций добавления ... фиксированаВы в этом уверены? ссылка на доку есть?
...
Рейтинг: 0 / 0
Как найти число
    #36079721
Уверен. Специально перечитал =)
This class offers constant time performance for the basic operations (add, remove, contains and size)
Если я правильно перевел с вражеского, конечно =)
...
Рейтинг: 0 / 0
Как найти число
    #36079729
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft пишет:

> Скорость выполнения операций добавления ... фиксирована
>
> Вы в этом уверены? ссылка на доку есть?

Да, это так.

Только я не понял, какую юный падаван решал задачу, и, если
ту, которую я думаю, как он её решил. В смысле, там неправильно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36079735
гдеже?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Варант с битовой картой тогда логичнее...
Или сделать второй массив...размерностью до M
Прогоняя исходный в цикле, ставим 1-ку по индексу, равному значению элемента.
Если потом встречается равный, все, приехали.
...
Рейтинг: 0 / 0
Как найти число
    #36079743
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
miksoft пишет:

> Скорость выполнения операций добавления ... фиксирована
>
> Вы в этом уверены? ссылка на доку есть?

Да, это так.Тогда похоже на O(N).

MasterZivТолько я не понял, какую юный падаван решал задачу, и, если
ту, которую я думаю, как он её решил. В смысле, там неправильно.
Что именно неправильно?
...
Рейтинг: 0 / 0
Как найти число
    #36079757
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гдеже?Варант с битовой картой тогда логичнее...
Или сделать второй массив...размерностью до M
Прогоняя исходный в цикле, ставим 1-ку по индексу, равному значению элемента.
Если потом встречается равный, все, приехали.То, что вы описываете - и есть битовая карта. Почему "или" ?
...
Рейтинг: 0 / 0
Как найти число
    #36079769
MasterZiv
Только я не понял, какую юный падаван решал задачу, и, если
ту, которую я думаю, как он её решил. В смысле, там неправильно.


Я вот тоже не вижу косяков, кроме того, что в цикле прохода по массиву вместо ELEMENTS_COUNT жестко забито 100 000. Буду весьма признателен MasterZiv, если он укажет в чем я не прав.
...
Рейтинг: 0 / 0
Как найти число
    #36079780
гдеже?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

да просто рамером.
Не ругайте сильно, я тоже падаван, и я имел в виду лишь порядок действий)
...
Рейтинг: 0 / 0
Как найти число
    #36079842
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гдеже?miksoft,
да просто рамером.
Не ругайте сильно, я тоже падаван, и я имел в виду лишь порядок действий)
для данной задачи не требуется индексировать ряд чисел, так что одного бита на число (битовой карты) достаточно.
Поражают только размеры - 536870912 байт для любых 32-битных чисел
...
Рейтинг: 0 / 0
Как найти число
    #36079843
гдеже?miksoft,
Не ругайте сильно, я тоже падаван

Тебя еще не приняли в падаваны ;)
...
Рейтинг: 0 / 0
Как найти число
    #36079847
гдеже?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень юный падаван,

Подождем Йоду...
...
Рейтинг: 0 / 0
Как найти число
    #36079854
гдеже?
Подождем Йоду...

Главное, что бы пришел Йода, а не Энакин из третьей части =)
...
Рейтинг: 0 / 0
Как найти число
    #36079867
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как найти число
    #36079910
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
учебные примеры на Pascal
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
while M[ 1 ]<>M[M[ 1 ]]
 do
 begin
 MM:=M[ 1 ];
 M[ 1 ]:=M[M[ 1 ]];
 M[MM]:=MM;
 end;
только число 1 не должно быть в массиве M
...
Рейтинг: 0 / 0
Как найти число
    #36079941
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexandrPlusучебные примеры на Pascal
Похоже, это решается какой-то частный случай обсуждаемой задачи, довольно ограниченный.
...
Рейтинг: 0 / 0
Как найти число
    #36080072
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftAlexandrPlusучебные примеры на Pascal
Похоже, это решается какой-то частный случай обсуждаемой задачи, довольно ограниченный.

по задаче
N = M+1
и тогда шоб красиво - так может быть
Код: plaintext
1.
2.
3.
4.
while m[ 0 ]!=m[m[ 0 ]]:
    mm = m[ 0 ]
    m[ 0 ] = m[m[ 0 ]]
    m[mm]=mm
...
Рейтинг: 0 / 0
Как найти число
    #36080073
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexandrPlus, например, в приведенном строго просматривается условие N >= M, а такого в условиии нет
...
Рейтинг: 0 / 0
Как найти число
    #36080080
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexandrPlus...по задаче
N = M+1
и тогда шоб красиво - так может быть
Код: plaintext
1.
2.
3.
4.
while m[ 0 ]!=m[m[ 0 ]]:
    mm = m[ 0 ]
    m[ 0 ] = m[m[ 0 ]]
    m[mm]=mm

если это к задаче, которую для прикола привел я, то там никаких перестановок не нужно
...
Рейтинг: 0 / 0
Как найти число
    #36080085
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дописать для "танкистов":
искомое число будет в m[0]
...
Рейтинг: 0 / 0
Как найти число
    #36080093
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vinoAlexandrPlus...по задаче
N = M+1
и тогда шоб красиво - так может быть
Код: plaintext
1.
2.
3.
4.
while m[ 0 ]!=m[m[ 0 ]]:
    mm = m[ 0 ]
    m[ 0 ] = m[m[ 0 ]]
    m[mm]=mm

если это к задаче, которую для прикола привел я, то там никаких перестановок не нужно

так и в этой другого N не может быть
ничего не переставляет - указатели
...
Рейтинг: 0 / 0
Как найти число
    #36080121
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В задаче за наименьшее "математическое" время - то есть перестановки в том времени.
Так наверное?
...
Рейтинг: 0 / 0
Как найти число
    #36080170
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexandrPlus, очевидно, что когда N = M+1, задача вырождается в расчетную: искомое число = сумма элементов -сумма арифметической последовательности (1,2,..,M)
...
Рейтинг: 0 / 0
Как найти число
    #36080184
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexandrPlus[quot vino][quot AlexandrPlus]...так и в этой другого N не может быть...
здесь как раз N <= M и только поиском можно найти искомое число
...
Рейтинг: 0 / 0
Как найти число
    #36080218
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft пишет:

> Тогда похоже на O(N).
Похоже, похоже. Только программа неправильная.
>
> MasterZiv
> Только я не понял, какую юный падаван решал задачу, и, если
> ту, которую я думаю, как он её решил. В смысле, там неправильно.
>
> Что именно неправильно?

Ну я не увидел там поиска уже найденного и выхода, в случае если он уже найден.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36080261
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vinoAlexandrPlus[quot vino][quot AlexandrPlus]...так и в этой другого N не может быть...
здесь как раз N <= M и только поиском можно найти искомое число

тады, чтобы приладить алгоритм - можно расширить массив N до M+1, заполнив нулями, и когда в m[0] или
по порядку следования в m встретится 0, то просто брать в m[0] следующие число по порядку ОДНОГО прохода
по m

при этом остаемся в "линейном" времени

P.S. Хотя есть память ограничена, то - не пройдет.
...
Рейтинг: 0 / 0
Как найти число
    #36080284
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу я не увидел там поиска уже найденного и выхода, в случае если он уже найден.
Вот же:Очень юный падаван if((s = set.size()) == size){
doubleValue = array[i];
break;
...
Рейтинг: 0 / 0
Как найти число
    #36080287
junior idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень юный падаванУверен. Специально перечитал =)
This class offers constant time performance for the basic operations (add, remove, contains and size)
Быть такого не может, просто потому что такого не может быть (теория информации вещь суровая, и против нее не попрешь, даже с джавой за пазухой).
А еще там есть приписка: " assuming the hash function disperses the elements properly among the buckets. ".
Код: plaintext
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.
    /**
     * Adds an item to this collection.
     * @param x any object.
     * @return true if this item was added to the collection.
     */
    public boolean add( AnyType x )
    {
        int currentPos = findPos( x );
        if( isActive( array, currentPos ) )
            return false;
       
        if( array[ currentPos ] == null ) 
            occupied++;
        array[ currentPos ] = new HashEntry( x, true );
        currentSize++;
        modCount++;
        
        if( occupied > array.length /  2  )        
            rehash( );
                
        return true;                   
    }

    /**
     * Method that performs quadratic probing resolution.
     * @param x the item to search for.
     * @return the position where the search terminates.
     */
    private int findPos( Object x )
    {
        int offset =  1 ;
        int currentPos = ( x == null ) ?  0  : Math.abs( x.hashCode( ) % array.length );

        while( array[ currentPos ] != null )
        {
            if( x == null )
            {
                if( array[ currentPos ].element == null )
                    break;
            }
            else if( x.equals( array[ currentPos ].element ) )   
                break; 
            
            currentPos += offset;                  // Compute ith probe
            offset +=  2 ;
            if( currentPos >= array.length )       // Implement the mod
                currentPos -= array.length;
        }

        return currentPos;
    }
Ну и где тут лайнеар тайм? log N как и полагается, а подобие линейности возникает только при работе с маленькими (десятки, сотни) множествами объектов, для которых хорошо написан hashCode(). На практике именно такие ситуации обычно и возникают, потому и написали "линейное", но это нифига не значит что миллион любых чисел можно так взять и вставить в этот хешсет так же быстро как в массив.
...
Рейтинг: 0 / 0
Как найти число
    #36080294
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexandrPlusvinoAlexandrPlus[quot vino][quot AlexandrPlus]...так и в этой другого N не может быть...
здесь как раз N <= M и только поиском можно найти искомое число

тады, чтобы приладить алгоритм - можно расширить массив N до M+1, заполнив нулями, и когда в m[0] или
по порядку следования в m встретится 0, то просто брать в m[0] следующие число по порядку ОДНОГО прохода
по m

при этом остаемся в "линейном" времени

P.S. Хотя есть память ограничена, то - не пройдет.
вот-вот, поэтому и нужна БИТОВАЯ карта, ее размер будет минимален
перестановка, на самом деле, не считается дешевой операцией, и к тому же Вы захотели дополнительное условие проверять (на =0)
а то,что выделено, может привести к зацикливанию
...
Рейтинг: 0 / 0
Как найти число
    #36080313
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexandrPlus...можно расширить массив N до M+1, заполнив нулями, и...
вот главная идея - тогда, похоже, можно применить расчетную формулу
...
Рейтинг: 0 / 0
Как найти число
    #36080323
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее, я глюканул, - там же не будет последовательности
...
Рейтинг: 0 / 0
Как найти число
    #36080332
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень юный падаван пишет:

> Случайно к вам попал =)
> Но прям даже интересно стало. А как оцените такой код? Это джава,

Это хренотень какая-то а не джава. Ну да ладно.
Должно быть что-то типа

Код: plaintext
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.
import java.lang.*;
import java.util.*;

public class FindDouble
{

     static final int ELEMENTS_COUNT =  10000 ;

     static int[] elements = new int[ELEMENTS_COUNT];
     static Set<Integer> metElements = new HashSet<Integer>();

     public static void main(String args[])
     {
	for(int i =  0 ; i < ELEMENTS_COUNT; i++)
	    elements[i] = i;

	elements[ELEMENTS_COUNT/ 5 ] =  123 ;
	
	Integer doubledElement = null;
	for( int element : elements )
	{
	    if( metElements.contains(element) )
	    {
		doubledElement = new Integer( element );
		System.out.println("Found doubled element " + doubledElement.toString() );
	    }
	    else
	    {
		metElements.add( new Integer( element ) );
	    }
	}
     }
}

Код: plaintext
1.
2.
3.
ziv@xxx:~/tmp$ javac -Xlint:unchecked  FindDouble.java
ziv@xxx:~/tmp$ java FindDouble
Found doubled element 123

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36080336
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Очень юный падаван
> if((s = set.size()) == size){
> doubleValue = array[i];
> break;

Вот я и не понял, при чём тут размер какой-то.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36080342
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junior idiot пишет:

> такие ситуации обычно и возникают, потому и написали "линейное", но это
> нифига не значит что миллион любых чисел можно так взять и вставить в
> этот хешсет так же быстро как в массив.

Время -- линейное, но алгоритм не обладает в общем случае статистической
устойчивостью. Т.е. иногда может срываться. Хорошо, что ты кстати это
знаешь. Многие тупо думают что скорость поиска в хэш-таблице - строго
константа.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36080359
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно обратиться к массиву как к таблице через соответствующий SQL запрос.
Можно вместо массива использовать тот же словарь из библиотеки scripting (он не пропустит дупликат)....
...
Рейтинг: 0 / 0
Как найти число
    #36080365
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv

> Очень юный падаван
> if((s = set.size()) == size){
> doubleValue = array[i];
> break;

Вот я и не понял, при чём тут размер какой-то.
как я понял - если размер множества не изменился, то последнее вставленное число в нем уже было.
...
Рейтинг: 0 / 0
Как найти число
    #36080411
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vinoAlexandrPlusvinoAlexandrPlus[quot vino][quot AlexandrPlus]...так и в этой другого N не может быть...
здесь как раз N <= M и только поиском можно найти искомое число

тады, чтобы приладить алгоритм - можно расширить массив N до M+1, заполнив нулями, и когда в m[0] или
по порядку следования в m встретится 0, то просто брать в m[0] следующие число по порядку ОДНОГО прохода
по m

при этом остаемся в "линейном" времени

P.S. Хотя есть память ограничена, то - не пройдет.
вот-вот, поэтому и нужна БИТОВАЯ карта, ее размер будет минимален
перестановка, на самом деле, не считается дешевой операцией, и к тому же Вы захотели дополнительное условие проверять (на =0)
а то,что выделено, может привести к зацикливанию

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
while (M[ 0 ]<>M[M[ 0 ]])or(M[ 0 ]= 0 )
 do
 begin
 if M[ 0 ]<> 0 
   then
   begin
   MM:=M[ 0 ];
   M[ 0 ]:=M[M[ 0 ]];
   M[MM]:=MM;
   end
   else
   begin
   M[ 0 ]:=M[i];
   Inc(i);
   end;
 end;

ничего не зацикливается - и один проход (i)

перестановка (изменение указателей) вообще не дешевая,
но речь идет о "математическом" времени
...
Рейтинг: 0 / 0
Как найти число
    #36080456
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnМожно обратиться к массиву как к таблице через соответствующий SQL запрос.


В "математическом" времени SQL-запрос в общем случае - комбинаторный перебор ведь, да ещё будет декартово произведение.
...
Рейтинг: 0 / 0
Как найти число
    #36080465
vino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexandrPlus
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
M[ 0 ]:= 0 ;
i:= 1 ; // пропуск нулевой итерации
while (M[ 0 ]<>M[M[ 0 ]])or(M[ 0 ]= 0 ) do
 begin
  if M[ 0 ]<> 0  then
   begin
    MM:=M[ 0 ];
    M[ 0 ]:=M[M[ 0 ]];
    M[MM]:=MM;
   end
   else
   begin
    M[ 0 ]:=M[i];
    Inc(i);
   end;
 end;
ничего не зацикливается - и один проход (i)...
один проход - слишком оптимистично сказано, так как ячейки, наполненные нулями, тоже начнут проверяться, а это уже не N ячеек
...
Рейтинг: 0 / 0
Как найти число
    #36080599
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зив, а чем принципиально с точки зрения скорости работы отличается твой код на жабе от такой простой лабуды:

Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


const int N =  100 ;
const int M =  1000 ;

int main()
{
     int i;
     int arr[N];
     int buffer[M];

     srand (time(NULL));

     for(i =  0 ; i < N; i++)
        arr[i] = (rand() % M) +  1 ;

     for(i =  0 ; i < N; i++)
     {
          if(buffer[arr[i]] ==  1 )
          {
               printf("First found duplicate is %i \n",arr[i]);
               break;
           }
           else
               buffer[arr[i]] =  1 ;
      }

	 return  0 ;
}

Ну понятно, твой HashTable будет занимать меньше места в памяти. Ну ты вроде на память забил и делал упор на быстродействие. Так этот вариант ещё и побыстрее будет, бо хэши то вычислять нэ трэба...
...
Рейтинг: 0 / 0
Как найти число
    #36080637
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft пишет:

> как я понял - если размер множества не изменился, то последнее
> вставленное число в нем уже было.

Вау, какие полёты мыслей ! А я и недопёр ! А по-простому
нельзя было ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36080645
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_n пишет:

> Зив, а чем принципиально с точки зрения скорости работы отличается твой
> код на жабе от такой простой лабуды:

В общем-то ничем, если не учитывать, что твой код не работает
(не инициализируется массив buffer[M]). А так -- массив -- частный
случай хэш-таблицы. Только памяти жрёт больше, как ты и заметил.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36080661
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает
...
Рейтинг: 0 / 0
Как найти число
    #36080774
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vinoAlexandrPlus, очевидно, что когда N = M+1, задача вырождается в расчетную: искомое число = сумма элементов -сумма арифметической последовательности (1,2,..,M)

А мне подумало - вспоминая то, когда в ВУЗе программировали голые процессоры - программа из 0 и 1: то есть программируя, невольно думаешь как машина Тьюринга - вычисления гораздо более затратны, чем сравнения ячеек и смещения с ячейки на ячейку.

А генетические алгоритмы - для задач оптимизации оказываются более эффективны, чем расчетные.
...
Рейтинг: 0 / 0
Как найти число
    #36080917
студентик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alusovПодскажите правильный алгоритм. Дан массив размера N из целых чисел, принимающих значения от 1 до M, при этом одно число в этом массиве повторяется два раза.
Как найти число за наименьшее время.

Хм... По-моему, условие несколько неполное. Не раскрыто какие вспомогательные структуры данных разрешается использовать массивы, множества, либо, вообще, задача должна быть решена "на месте" без затрат памяти, т.е. используя только исходные данные ну и миниум переменных(индексы, буфер и прочее). В случае решения "на месте" думаю только сортировка поможет...
...
Рейтинг: 0 / 0
Как найти число
    #36080940
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
грешок есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
i:= 0 ;
while (M[ 0 ]<>M[M[ 0 ]])or(M[ 0 ]= 0 ) do
 begin
  if M[ 0 ]<> 0  then
   begin
    MM:=M[ 0 ];
    M[ 0 ]:=M[M[ 0 ]];
    M[MM]:=MM;
   end
   else
   begin
    M[ 0 ]:=M[i];
    M[i]:= 0 ;
    Inc(i);
   end;
 end;
...
Рейтинг: 0 / 0
Как найти число
    #36081582
MasterZiv
Вау, какие полёты мыслей ! А я и недопёр ! А по-простому
нельзя было ?

Ну, мы уже выяснили, что на добавление уходит время, зависящее от количества элементов. Думаю, что время поиска элемента имеет ту же зависимость. А вот проверка размера, имхо, есть операция по времени фиксированная и более дешевая =) Собственно, руководствовался только этими соображениями.
...
Рейтинг: 0 / 0
Как найти число
    #36081732
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень юный падаван пишет:

> Ну, мы уже выяснили, что на добавление уходит время, зависящее от
> количества элементов. Думаю, что время поиска элемента имеет ту же

Во-первых, вставка в хеш-таблицу -- те же O(1).
Во-вторых, тебе вставлять-то в таблицу всё равно надо.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как найти число
    #36081750
MasterZiv
Во-первых, вставка в хеш-таблицу -- те же O(1).
Во-вторых, тебе вставлять-то в таблицу всё равно надо.

Я просто объяснял, почему проверял размер, а не делал проверку вхождения элемента в множество. То, что элемент в множество надо вставить - даже не обсуждается. А вот проверить размер - дешевле чем найти вхождение элемента.
...
Рейтинг: 0 / 0
Как найти число
    #36081763
junior idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Очень юный падаван пишет:

> Ну, мы уже выяснили, что на добавление уходит время, зависящее от
> количества элементов. Думаю, что время поиска элемента имеет ту же

Во-первых, вставка в хеш-таблицу -- те же O(1).
Во-вторых, тебе вставлять-то в таблицу всё равно надо.

Он делает add + проверку размера, это вдвое дешевле, чем contains + add, если только HashSet не кэширует findPos(), а он его, судя по найденным исходникам, не кэширует.
...
Рейтинг: 0 / 0
Как найти число
    #36201290
HolyGun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
program p2;

{$APPTYPE CONSOLE}

const
  n =  15 ;
  m =  25 ;

var
  a: array[ 1 ..n] of LongWord = ( 5 ,  6 ,  7 ,  8 ,  9 ,  17 ,  2 ,  3 ,  4 ,  11 ,  7 ,  13 ,  25 ,  20 ,
     24 );

procedure FindDupe;
var
  p: LongWord; //address of bitmap
  s: LongWord; //size of bitmap
  i: LongWord;
begin
  s := m div  8 ;
  if m mod  8  <>  0  then
    Inc(s);
  p := LongWord(GetMemory(s));
  for i :=  1  to n do
    begin
      if (PByte(p + (a[i] div  8 ))^ shr (a[i] mod  8 )) and  1  =  0  then // if bit number a[i] is not set then ...
        Inc(PByte(p + (a[i] div  8 ))^, ( 1  shl (a[i] mod  8 ))) // ... set the bit.
      else // the bit number a[i] has already been set.
        begin
          Writeln('Duplicate element is: ',a[i]);
          Break;
        end;
    end;
  FreeMemory(Pointer(p));
end;

begin
  FindDupe;
  Readln;
end.

Ответы на 1 (поиск нулевых битов) и 3-е задания (поиск дубликатов файлов) у мну тоже есть, могу выложить. Один хрен не взяли
...
Рейтинг: 0 / 0
Как найти число
    #36249137
Dellon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HolyGun,
Если не сложно выложи решения задачи 1 и 3 на Делфе. Большое спасибо
...
Рейтинг: 0 / 0
74 сообщений из 74, показаны все 3 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как найти число
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]