powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибки в функции реверса каждого слова строки
25 сообщений из 151, страница 6 из 7
Ошибки в функции реверса каждого слова строки
    #38570127
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу(
Но так уже мне не нравится, не так красиво как раньше. Пока не додумался как обойтись без этой доп проверки, и подглядывать не хочу. Вечером ещё подумаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//реверс строки с указанного байта
void reverse_each_word(char* current)//указатель на стартовый байт для реверса
{
	char* range_s = current;
	while (*current)//иду по всей строке
	{	
		if (*current == ' ')
		{
			reverse(range_s, current-1);
			range_s = current + 1;
		}
		else if (*(current + 1) == '\0')
		{
			reverse(range_s, current);
		}
		++current; //иду к следующему элементу строки
	}
}
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38570136
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нашёл что-то "go to disassembly" . В контекстном меню при отладке смотрел. Видимо так смотрел.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38570142
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во время выполнения, когда на брейкпоинте остановится - правая кнопка на коде
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38570184
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим алфавит состоит из 23 символов. Берём словарь по 4 байта, получаем 23^4 записей. В словаре будет два атрибута, значение и реверс. Делаем классический реверс но уже используя этот словарь. Допустим реверс идёт для текста длиной n. Как мне рассчитать n, для которой данный алгоритм будет давать прирост по времени хотя бы в два раза по сравнению с классическим алгоритмом ?

Если я создам словарь для 2 байт, как мне считывать по два байта ? Создать свой тип данных ?
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38570186
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TВо время выполнения, когда на брейкпоинте остановится - правая кнопка на коде


Окей, понял :)
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38570205
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы сделать реверс из n символов нужно сделать n операций.

Саш. Мир полон замечательных и интересных алгоритмов. Тебе
не хочется обсудить что нибудь другое?
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38570245
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧтобы сделать реверс из n символов нужно сделать n операций.

Саш. Мир полон замечательных и интересных алгоритмов. Тебе
не хочется обсудить что нибудь другое?

Да, парень явно завис, зациклился видимо...
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38570247
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДопустим алфавит состоит из 23 символов. Берём словарь по 4 байта, получаем 23^4 записей. В словаре будет два атрибута, значение и реверс. Делаем классический реверс но уже используя этот словарь. Допустим реверс идёт для текста длиной n. Как мне рассчитать n, для которой данный алгоритм будет давать прирост по времени хотя бы в два раза по сравнению с классическим алгоритмом ?

Если я создам словарь для 2 байт, как мне считывать по два байта ? Создать свой тип данных ?
Про словарь это шутка была. Со словарем всегда будет медленнее.
Общий размер строки никак не повлияет на скорость, т.к. меняется только алгоритм реверса одного слова. Разбор на слова у тебя остается в обоих случаях.
Поиск в словаре тоже требует некоторых вычислений.

Этот алгоритм самый эффективный, есть только один способ попытаться ускорить: реализовать этот код на ассемблере, т.е. в командах процессора. Вполне возможно компилятор создал не самый идеальный код. Но тут надо сначала хорошенько ассемблер поизучать. Оно тебе надо?

maytonСаш. Мир полон замечательных и интересных алгоритмов.
+100500

SashaMercury, поищи себе задачку посложнее. Только эту допили чтоб reverse_each_word() покомпактнее была.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38570942
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЭтот алгоритм самый эффективный, есть только один способ попытаться ускорить: реализовать этот код на ассемблере, т.е. в командах процессора. Вполне возможно компилятор создал не самый идеальный код. Но тут надо сначала хорошенько ассемблер поизучать.

Это ты глубоко заблуждаешься.
Почему-то все думают, что ассемблер-- такой волшебный язык, на котором всё сразу автоматом начинает работать быстрее.

Даже если этот алгоритм записать в виде одной машинной комманды, его стоимость не изменится -- O(n) как было, так и будет.
Потому что для ревёрса слова in-place надо переместить n символов слова, для ревёрса слова с копированием в другой буфер, надо скопировать те же n символов слова.

Стоимости алгоритмов всегда считаются относительно кол-ва выполнения одной базовой операции.
Операция выбирается в зависимости от сущности алгоритма и цели оптимизации.

Стоимость данного алгоритма неизменна независимо от того, сколько машинных комманд ушло на программирование этого алгоритма.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38571112
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima TЭтот алгоритм самый эффективный, есть только один способ попытаться ускорить: реализовать этот код на ассемблере, т.е. в командах процессора. Вполне возможно компилятор создал не самый идеальный код. Но тут надо сначала хорошенько ассемблер поизучать.

Это ты грубоко ошибаешся.
Почему-то все думают, что ассемблер-- такой волшебный язык, на котором всё сразу автоматом начинает работать быстрее.

Даже если этот алгоритм записать в виде одной машинной комманды, его стоимость не изменится -- O(n) как было, так и будет.

Не надо к словам придираться.
1. Стоимость алгоритма величина условная, предназначенная для сравнения эффективности различных алгоритмов (не реализаций). Поэтому в данном случае стоимость алгоритма не изменится: O(n) как было, так и будет.
2. Код (реализация алгоритма) возможно будет работать быстрее созданного компилятором если написать на асме.

PS Ассемблер я немного знаю и не утверждал что всё сразу автоматом ускорится. Современные компиляторы достаточно эффективны и надо постараться написать так чтоб быстрее работало. Если заметил - я написал "возможно".
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38571280
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Если написать на ассемблере, операций не станет меньше, и они не станут быстрее.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38571284
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, я предлагаю уже прикрыть тему...
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38571300
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Dima_TТолько эту допили чтоб reverse_each_word() покомпактнее была.


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

Пять минут назад(снова в душе, что за душ у меня такой ) я подумал об этой задаче буквально 5 секунд и понял как ее допилить. Компилятора сейчас нет (на этой машине), но мне кажется что код ниже будет работать C: Причём до этого я ни секунды не думал со вчерашнего дня именно о том как её допилить, думал про рекурсию, но не про это. Удивляюсь, правильная мысль пришла буквально сразу. Такой код вероятно:

Код: 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.
//реверс закрытого промежутка байт [start,end]
void reverse(char* start, char* end) //адрес первого и последнего байта
{
	while (start<end)
	{
		char temp = *start;
		*start = *end;
		*end = temp;
		++start; 
		--end;
	}
} 

//реверс строки с указанного байта
void reverse_each_word(char* current)//указатель на стартовый байт для реверса
{
	char* range_s = current;
	while (*current)//иду по всей строке
	{	
		if (*(current+1) == ' ' || *(current + 1) == '\0')
		{
			reverse(range_s, current);
			range_s = current + 1;
		}
		++current; //иду к следующему элементу строки
	}
}



mayton, MasterZiv, Dima_T
нет не завис. Мне кажется что это фундаментальная задача, и такое долгое понимание того что необходимо n операций для реверса n байт даёт мне более глубокое понимание работы основной массы архитектур машин. Я каждый день ставил под сомнение этот алгоритм, и я не нашёл как по другому. Наверное нужна другая логика работы системы, например добавить градиент(к архитектуре машины) который будет показывать в какую сторону читать память.

В любом случае, все ваши комментарии и мои размышления за это время дали результат в виде того что фундамент на котором я стою теперь более устойчив. Спасибо.

Вы правы, не нужно зацикливаться, нужно двигаться дальше, но я ни капли не жалею часов потраченных на размышления по данному алгоритму.

Главный вывод:Хотеть не вредно, необходимо искать оптимальные решения для каждой задачи исходя из архитектуры машины, и ставить под сомнения каждый алгоритм. Нужно искать оптимальное решение всегда.
Побочный/повторный вывод: указатели чудо C:
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38571360
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПобочный/повторный вывод: указатели чудо C:добро пожаловать в семью :)
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38571362
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury...Такой код вероятно:
Так уже хорошо. До компилятора доберешься, маленькую ошибку исправь и завязывай с этой задачей. Ищи следующую :)
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38571433
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

зачем ты переписал мой идеальный reverse? :D зачем ты переписал reverse_each_word, если предложенная мной реализация гибче (пробелы, табуляторы и другие вайтспейсы могут разделять слова в неограниченном количестве стоять перед и после)?

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

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

удачи!
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38571821
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury ...
Код: 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.
//реверс закрытого промежутка байт [start,end]
void reverse(char* start, char* end) //адрес первого и последнего байта
{
	while (start<end)
	{
		char temp = *start;
		*start = *end;
		*end = temp;
		++start; 
		--end;
	}
} 

//реверс строки с указанного байта
void reverse_each_word(char* current)//указатель на стартовый байт для реверса
{
	char* range_s = current;
	while (*current)//иду по всей строке
	{	
		if (*(current+1) == ' ' || *(current + 1) == '\0')
		{
			reverse(range_s, current);
			range_s = current + 1;
		}
		++current; //иду к следующему элементу строки
	}
}





Гениально. (я без сарказма). Давно бы так.

SashaMercurymayton, MasterZiv, Dima_T
нет не завис. Мне кажется что это фундаментальная задача,


Есть задачи и гораздо более фундаментальные.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38572344
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Dima_Tмаленькую ошибку исправь

Вчера про это кстати подумал, и даже сначала так написал, а потом решил что можно оставить как раньше. Должно быть так
Код: plaintext
1.
range_s = current + 2;



egorych, спасибо C: Как-будто бы в мафиозный клан попал :D (я такую фразу слышал в фильмах про итальянских мафиози вроде :DDD)

Анатолий Широков,
мне просто хотелось сделать это самому ;) Ваш код и код Дмитрия с рекурсией я разберу более детально позднее. Сегодня хочу разобрать следующую главу K&R.


MasterZivЕсть задачи и гораздо более фундаментальные.


Надеюсь доберусь и до них :)

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

Почему именно полуоткрытые ? Закрытый интервал более читаем, так наверное. Неужели из-за индексации массивов с нуля ?
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38575093
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

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

В возникших вопросах "А можно пример? Можно разъяснить подробнее?" советую разобраться самому (попробовать реализовать некоторые алгоритмы из stl на отрезках, например), это может дать более твердое понимание.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38575102
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

вообще многие вопросы которые вы задаете, стоило бы обсуждать лет 7-10 назад. Сегодня в них лучше разбираться самому, все это уже везде разжевано, расписано, рассказано. С каждым годом кол-во усваиваемой студентами информации возрастает (было время когда в "ВУЗе" учили умножать). Вы же идете против этого процесса.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38575226
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дайте ссылку где это обсосано. Обоснование от вас не услышал.
Студенты тупеют духовно, и потому умнеть в плане мат/прог не могут по дефолту. Основная часть.
Актуальность вопросов 7-10 лет ? Я рад что вы такого высокого мнение о вопросах ;) Спасибо за комментарий ;)
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38575238
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДайте ссылку где это обсосано. Обоснование от вас не услышал.
Студенты тупеют духовно, и потому умнеть в плане мат/прог не могут по дефолту. Основная часть.
Актуальность вопросов 7-10 лет ? Я рад что вы такого высокого мнение о вопросах ;) Спасибо за комментарий ;) Ссылку ищите сами. Не надо плохо думать о студентах. Те которых я знаю, вполне достойные трудолюбивые люди. Пожалуйста.
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38575262
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, поищу. Может быть вы правы и я ошибаюсь
...
Рейтинг: 0 / 0
Ошибки в функции реверса каждого слова строки
    #38575305
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПочему именно полуоткрытые ? Закрытый интервал более читаем, так наверное. Неужели из-за индексации массивов с нуля ?
На закрытом диапазоне нельзя без костылей выразить пустой диапазон.
А на полуоткрытом - элементарно, указав два одинаковых индекса.
...
Рейтинг: 0 / 0
25 сообщений из 151, страница 6 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибки в функции реверса каждого слова строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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