Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.0.240] |
|
Сообщ.
#1
,
|
|
|
Вопрос прост и злободневен: какой код сделает это максимально быстро? Средняя длина строки 1000 символов, количество пробелов случайно. Например, у нас есть строка "a___b__c", на выходе нужна "a_b_c" - пробел заменён подчёркиванием, т.к. тут тоже режет )
|
Сообщ.
#2
,
|
|
|
А что, ничего не придумалось?
|
Сообщ.
#3
,
|
|
|
Да вариантов-то... Replace в цикле да RegExp...
|
Сообщ.
#4
,
|
|
|
Вариантов много, нужен лучший.
|
Сообщ.
#5
,
|
|
|
Цитата Akina @ Да вариантов-то... Replace в цикле да RegExp... Насчёт RegExp не скажу ничего, т.к. не в курсе, а Replace в каждой итерации будет копировать всю строку. Может сделать Arr = Split(SrcString, "__"), а потом DstString = Join(Arr, "_")? |
Сообщ.
#6
,
|
|
|
Цитата BlackSun @ Вариантов много, нужен лучший. отбенчмаркай каждый на реальных данных да выбери... Цитата Олег М @ Replace в каждой итерации будет копировать всю строку тут проблемность зависит исключительно от наличия или отсутствия гарантированного потолка количества последовательных пробелов. |
Сообщ.
#7
,
|
|
|
Самый быстрый - простой конечный автомат, состояние которого - количество пробелов подряд. Псевдокод inplace варианта
shift = 0 for каждого символа: if s[i]=пробел state++ else state = 0 if state > 1 shift++ else s[i-shift] = s[i] |
Сообщ.
#8
,
|
|
|
Цитата Akina @ Replace в каждой итерации будет копировать всю строку тут проблемность зависит исключительно от наличия или отсутствия гарантированного потолка количества последовательных пробелов. Да, что-то я прогнал. Можно делать Replace, пока тот не вернёт такую же строку. |
Сообщ.
#10
,
|
|
|
нада в цикле выполнять replace двух пробелов на один до тех пор, пока не получим результат replace той же длины, что аргумент.
типа так: a="обрабатываемая строка" do b=replace a,"__","_" if len(a)=len(b) then exit do a=b loop 'b содержит строку без лишних пробелов. сравнивать именно длину строк вместо сравнения самих строк -- на сколько-то процентов быстрее, поэтому так. |
Сообщ.
#11
,
|
|
|
Цитата DarknessPaladin @ на сколько-то процентов быстрее, поэтому так. Если начать бороться за проценты - фтопку a=b! |
Сообщ.
#12
,
|
|
|
Так побыстрее будет:
Private Sub DblSpcRemove(Src As String, Dst As String) Dim L As Long, p As Long, Ar() As Integer Dim i As Long, f As Boolean L = Len(Src) ReDim Ar(L - 1) CopyMemory i, ByVal VarPtr(Src), 4 CopyMemory Ar(0), ByVal i, L * 2 For i = 0 To L - 1 If Ar(i) = 32 Then If Not f Then f = True Ar(p) = 32 p = p + 1 End If Else f = False Ar(p) = Ar(i) p = p + 1 End If Next i Dst = Space(p) CopyMemory i, ByVal VarPtr(Dst), 4 CopyMemory ByVal i, Ar(0), p * 2 End Sub Но можно ещё немного ускорить. |