Как бы Вы обработали String?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Как бы Вы обработали String?

Сообщение |kerish| » 08.04.2007 (Вс) 11:44

Дана переменная типа String.
В неё построчно (через VbCrlf) забиты фамилии (Всего более 12000).

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

Какой алгоритм Вы бы использовали в плане быстродействия этой операции.

Всё, что я пробовал занимало значительные промежутки времени :(

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.04.2007 (Вс) 11:49

InStr
Lasciate ogni speranza, voi ch'entrate.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.04.2007 (Вс) 12:05

alibek писал(а):InStr


У меня это занимает 37 Секунд...
Долговато :(

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.04.2007 (Вс) 12:15

Быстрее на VB ничего нет.
Split будет медленнее процентов на 5, все остальное гораздо медленнее.

P.S. Почему-то у меня 50 циклов на 12000 строк через InStr заняли 1.3 секунды, 50 циклов с Split заняли 1.5 секунд.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.04.2007 (Вс) 12:18

37 Секунд

У меня это занимает 0.02 с.
Видимо, ты ищёшь vbCrLf каждый раз с начала строки. Хотя я не удивлён по прошлым топикам.

Да, функция Split занимает такое же время.
Да, это если не компилировать. Если компилировать, это мгновенно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.04.2007 (Вс) 12:32

GSerg писал(а):Видимо, ты ищёшь vbCrLf каждый раз с начала строки.Хотя я не удивлён по прошлым топикам.


А что было в прошлых топиках :?:

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.04.2007 (Вс) 12:45

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

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.04.2007 (Вс) 13:14

GSerg писал(а):В прошлых топиках ты много раз задавал вопросы, из которых было видно, что ты не знаешь даже базовых вещей, но притом уверен в своей правоте и покушаешься на написание больших и сложных вещей. Про конкретную ошибку я не говорил.


Просмотрел через поиск свои топики.
Сделал вывод - это было видно тебе.

Насчет "покушения на написание больших и сложных вещей" выпал в осадок :D

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

Зато, как-то раньше не замечал, только сейчас заметил при просмотре, что в большинстве этих топиков ты питаешь ко мне бурю эмоций...

Сделай, пожалуйста, одолжение - на надо хотя бы в топиках созданных мной оставлять свои замечания насчет прямоты рук и всё, что у тебя на душе наболело. Если я тебе не нравлюсь - дело твоё. Можешь в приват мне писать, какой я нехороший и примитивный человек. В топиках делать это не к чему. Я тебя грязью не поливаю, и меня не надо.

И всё таки я был бы рад, если кто-нибудь оставил пример, как забивается массив за несколько секунд...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 08.04.2007 (Вс) 13:21

|kerish|, ты издеваешься над нами.

Функция называется Split. Работает ну просто наимгновеннейше для 12000 фамилий, специально проверил.
Последний раз редактировалось Amed 08.04.2007 (Вс) 13:22, всего редактировалось 1 раз.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.04.2007 (Вс) 13:22

Amed Я знаю, функцию Split.

Сейчас приведу пример, как это у меня...

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.04.2007 (Вс) 13:44

Попытался сделать быстрее.
Вышло вот это.
(Занимает 5-7 секунд)

Код: Выделить всё
Dim TmpStr As String, NowPos As Double, VbCrlfPos As Double, Total As Double
Dim Arr() As String

For a = 1 To 12000
TmpStr = TmpStr & "Иванов Иван Иванович" & a & vbCrLf
Next

Debug.Print "Start - " & Time

NowPos = 1
VbCrlfPos = 1
Total = 0
Do While VbCrlfPos <> Len(TmpStr)
VbCrlfPos = InStr(Mid$(TmpStr, NowPos), vbCrLf) + NowPos
Total = Total + 1
ReDim Preserve Arr(Total)
Arr(Total) = Mid$(TmpStr, NowPos, (VbCrlfPos - NowPos) - 1)
NowPos = VbCrlfPos + 1
Loop

Debug.Print "End - " & Time

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 08.04.2007 (Вс) 13:55

Код: Выделить всё
Dim TmpStr As String, Arr() As String, a As Long

TmpStr = "Иванов Иван Иванович"

For a = 1 To 12000
    TmpStr = TmpStr & vbCrLf & "Иванов Иван Иванович" & a
Next

Debug.Print "Start - " & Time

Arr = Split(TmpStr, vbCrLf)

Debug.Print "End - " & Time


Start - 14:56:58
End - 14:56:58
:)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.04.2007 (Вс) 13:56

Код: Выделить всё
As Double

Господи...

Код: Выделить всё
InStr(Mid$(TmpStr, NowPos), vbCrLf)

Боже мой...


Код: Выделить всё
Private Sub Form_Load()
  Dim s As String, ss() As String, i As Long, p As Long, pp As Long
 
  s = String$(12000& * 9, 0)
  For i = 0 To 12000 - 1
    Mid$(s, i * 9 + 1, 9) = "фамилия" & vbCrLf
  Next
 
 
  Debug.Print "Start - " & Time
 
  pp = 1
  ReDim ss(1 To 1)
  Do
    p = InStr(pp, s, vbCrLf)
    If p Then
      ss(UBound(ss)) = Mid$(s, pp, p - pp)
      ReDim Preserve ss(LBound(ss) To UBound(ss) + 1)
      pp = p + 2
    Else
      Exit Do
    End If
  Loop
 
  Debug.Print "End - " & Time
 
  ss = Split(s, vbCrLf)
 
  Debug.Print "End 2 - " & Time
End Sub


Руки-то кривущие, |kerish|. И мне совершенно безразлично, нравится тебе упоминание об этом или нет. Не нравится - выпрямляй. Всего лишь. Всё очень просто.
Это первое, и второе - внятно можешь объяснить, чем Split не устраивает?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.04.2007 (Вс) 14:06

GSerg писал(а):
Код: Выделить всё
As Double

Господи...


Не вздыхай.
Double потому что неизвестно сколько строк будет в переменной String.
12000 я взял от балды.
Их там может быть и миллиард.

GSerg писал(а):Руки-то кривущие, |kerish|. И мне совершенно безразлично, нравится тебе упоминание об этом или нет. Не нравится - выпрямляй. Всего лишь. Всё очень просто.
Это первое, и второе - внятно можешь объяснить, чем Split не устраивает?


GSerg, спасибо за пример и перестань меня оскорблять.
Или с первого раза туго доходит?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.04.2007 (Вс) 14:19

|kerish| писал(а):Не вздыхай.
Double потому что неизвестно сколько строк будет в переменной String.
12000 я взял от балды.
Их там может быть и миллиард.

Максимальный размер пользовательской части адресного пространства процесса на 32-битной Windows - 2147483648 байт.
Максимальное положительное число, вмещающееся в Long - 2147483648.
Следовательно, даже если каждая фамилия будет иметь длину 1 байт, число типа Long сможет вместить их общее количество. Однако даже этого никогда не случится, поскольку каждый символ занимает 2 байта, а не 1, и потому запас Long вдвое шире максимального числа символов в строке.

Ты снова неправ. Странно.

|kerish| писал(а):GSerg, спасибо за пример и перестань меня оскорблять.
Или с первого раза туго доходит?

Тебя никто не оскорбляет.
Или "кривые руки" имеется в виду? Ну извини. Что вижу, то пою.
А что у тебя подобная реакция на критику, это внутренняя проблема, которую ты должен решать сам.

Меня просто удивляет, что человек, заявляющий о написании антивируса, антималвера и искусственного интеллекта, не знает подобных вещей. Этот контраст в моём сознании не укладывается и вызывает определённые реакции.

И повторю ещё раз: внятно можешь объяснить, чем Split не устраивает?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.04.2007 (Вс) 14:33

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

Ну отвали же от меня, ну третий раз уже прошу.
Неужели это так сложно??

Модераторы закройте, пожалуйста, тему.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.04.2007 (Вс) 14:48

Три раза вопрос был задан про Split. Ответа так и не было.
Видимо, просто учитель сказал "Split не использовать".
Как хочешь, закрываю.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 95

    TopList