0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 10
1

Ускорить работу программы

30.05.2016, 15:12. Показов 1659. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
суть такова, на форме имеется два текст бокса и кнопка, в первый текст бокс вводится набор букв, во второй цифра, которая будет означать количество букв в слове, далее набор букв из первого текст бокса разбивается на отдельные символы и заполняется в массив, после чего из них генерируются слова, так вот этот код работает быстро к примеру на 3-4 символа (как в моем коде, скинутом для примера), вчера поставил генерацию из 12 символов, по 5 букв в слове так он залип на минут 15, мой вопрос таков: можно ли ускорить работу моего кода, или оптимизировать как то, или даже заменить что то, так как я может вообще использую "деревянный метод" так как программированием давно не занимался, и второй под вопрос, можно ли отсеивать не существующие слова сразу, Application.CheckSpelling - пропускает много не нужных слов.

пример моего кода на генерацию 3 слова из трех букв:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim razmer, schet As Integer
schet = 1
kolbukv = CInt(Text1.Text)
str = Text2.Text
razmer2 = Len(str)
ReDim sim(razmer2)
For i = 1 To Len(Text2)
   sim(i) = Mid$(Text2, i, 1)
  Next i
If kolbukv = 3 Then
 razmer = UBound(sim())
  For i1 = 1 To razmer
   For i2 = 1 To razmer
    For i3 = 1 To razmer
    slovo = sim(i1) & sim(i2) & sim(i3)
      If Application.CheckSpelling(slovo) Then
        Cells(schet, 1) = slovo
        schet = schet + 1
      End If
  Next i3
 Next i2
Next i1
Добавлено через 5 часов 53 минуты
может я плохо объяснил суть вопроса, в общем это генератор слов из заданных букв, буквы вводятся в первый текст бокс, а во второй вводится цифра, означающая количество букв в слове, после чего буквы из первого текст бокса заполняются в массив отдельными символами, а дальше с помощью вложенных циклов эти отдельные элементы массива присоединяются друг к другу во всех возможных комбинациях, и выводятся в ячейку таблицы Excel, я скинул фрагмент кода в котором генерация слова идет из трех букв, можно ли реализовать эту задачу другим способом, так как мой способ затрачивает много времени.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2016, 15:12
Ответы с готовыми решениями:

Завершить работу программы обработав событие form_unload
При закрытии основной формы, программа не закрывается. Это видно при нажатии клавиш ctrl+alt+del...

Как продолжить работу программы после включения компьютера?
Допустим у меня идут вычисления и у меня свет отрубили...Комп выключится..Как сделать, чтобы после...

Ускорить работу программы
Лексикографический порядок чисел (Время: 1 сек. Память: 16 Мб Сложность: 31%) Натуральные числа...

Ускорить работу программы
Здравствуйте. Помогите пожалуйста ускорить работу программы: n = d = for i in range(n): ...

23
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
31.05.2016, 09:57 2
РусланМухмадови
Не берусь судить обо всем вашем коде. Но...
1. Вы используете переменную str. Однако есть
функция с этим именем Str(). Использование такой
переменной вполне может тормозить работу программы
(Не советую далее так делать)
2. Вы объявили переменную razmer как Integer. Это вы так
думаете? На самом деле эта переменная имеет тип Variant.
Это один из самых медленных типов переменных. Каждую
переменную надо объявлять Персонально!!
Интересно, вы используете опцию Option Explicit? Советую
использовать в каждой программе и объявлять все переменные.
3. Вы используете в Цикле (!!) такую переменную
Application.CheckSpelling(slovo) (!!)
- Вот еще причина медленной работы вашей программы
возможно в десятки раз! Такие вещи надо сокращать и в явном виде
не использовать. Просто введите иную (короткую) переменную и
передайте ей функцию использованной вами составной переменной.
1
0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 10
31.05.2016, 13:53  [ТС] 3
geh, а можно 3 пункт немного подробней? и большучее спасибо за рассмотрение моего вопроса, я приму во внимание все ваши замечания.

Добавлено через 1 час 47 минут
а все, понял и третий пункт, благодарю.
а отсеивание не существующих слов возможно? как то через словарь экселя например...
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
31.05.2016, 15:28 4
РусланМухмадови
Отсеивание конечно возможно. Я бы поставил фильтр.
Правда мне не известно что у вас за слова. Насчет
Экселя сказать ничего не могу - я с ним не работаю.
приложение
1. Самый быстрый тип данных это Long
2. На втором месте Integer. Этот тип является частью
Long и работает медленнее за счет того что происходит
постоянная конвертация integer-long-integer. Потом идут
другие целочисленные типы, далее Double, Single, ....
3. Наконец Variant
4. И это не все. Ну например Text1.Text. Такие вещи надо
сразу присваивать реальным переменным. Они работают
гораздо быстрее приведенного примера. Большие потери
в скорости особенно заметны в цикле.
1
0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 10
01.06.2016, 07:35  [ТС] 5
geh, о каком фильтре идет речь? его нужно будет самому создать? или есть какие то средства проверки в самом VB?
вот мой фрагмент кода, этот блок кода работает если во второй текст бокс вести цифру 3, в других блоках код будет аналогичен, просто увеличится вложенность цикла в зависимости от количества букв в слове.

[
Visual Basic
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
Private Sub knop_Click()
Dim razmer2 As Long
Dim i1 As Long
Dim i2 As Long
Dim i3 As Long
Dim i4 As Long
Dim i5 As Long
Dim i6 As Long
Dim i7 As Long
Dim i8 As Long
Dim i9 As Long
Dim i10 As Long
Dim i11 As Long
Dim i12 As Long
Dim kolbukv As Long
Dim sim() As String
Dim strok As String
Dim s As Boolean
Dim slovo As String
Dim razmer As Long
Dim schet As Long
schet = 1
kolbukv = CInt(Text1.Text)//количество букв в слове
strok = Text2.Text      //получаем набор букв из которых будет слово
razmer2 = Len(Text2)  //получаем количество букв введенных в Text2, для создания массива
ReDim sim(razmer2)    //создаем и даем массиву размер 
For i = 1 To Len(Text2)
   sim(i) = Mid$(Text2, i, 1)   // загоняем набор букв по отдельности в массив
  Next i
If kolbukv = 3 Then              // если в Тext1 введена цифра 3, значит в слове три буквы должно быть
 razmer = UBound(sim())     
  For i1 = 1 To razmer
   For i2 = 1 To razmer
    For i3 = 1 To razmer
    slovo = sim(i1) & sim(i2) & sim(i3)   // лепим из букв помещенных в массив, все варианты слов
    s = Application.CheckSpelling(slovo) // проверка слова, которая пропускает кучу слов((
    If (s) Then
    Cells(schet, 1) = slovo      //вывод в эксель
    schet = schet + 1
    End If
  Next i3
 Next i2
Next i1
ElseIf kolbukv = 4 Then
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
01.06.2016, 08:07 6
РусланМухмадови
В данном случае фильтр - это список самых распространенных
сочетаний букв, которые Не встречаются в русских словах.
Такая проверка позволяет сразу выкидывать не годные слова.
1
0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 10
01.06.2016, 08:43  [ТС] 7
geh, его нужно самому написать? или же есть какая та функция?
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
01.06.2016, 08:47 8
РусланМухмадови, Вам нужно зайти с другого конца.
Зачем перебирать огромное количество бессмысленных сочетаний символов, если в конечном итоге все равно на выходе получаются слова, присутствующие в каком-то словаре?
Найдите подходящий Вам словарь и ищите в нем слова, подходящие под Ваши условия.
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
01.06.2016, 08:49 9
РусланМухмадови
Честно говоря, я не искал в интернете на эту тему.
Наверное такое есть... А делать самому? Ну если
Вам очень нужно... время много отнимет. Посмотрите
в интернете.
1
0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 10
01.06.2016, 08:52  [ТС] 10
SoftIce, а если в этих словарях нет нужного слова? пусть лучше будет фильтр с несуществующими словами, и проверять по нему, пусть он даже что то и пропустит левое, но уж точно не уберет "возможно нужное слово"
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
01.06.2016, 09:05 11
Цитата Сообщение от РусланМухмадови Посмотреть сообщение
а если в этих словарях нет нужного слова?
Значит это плохой словарь
1
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
01.06.2016, 09:15 12
Весь код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit
Option Compare Text
Private Sub CommandButton1_Click()
    Dim dic, s As String, i As Long, j As Long, n As Long, k As Long
    Open ThisWorkbook.Path & "\Dictionary.txt" For Input As #1
          dic = Split(Input(LOF(1), #1), vbCrLf)
    Close #1
    n = Val(TextBox1.Text): s = Trim$(TextBox2.Text)
    ThisWorkbook.Sheets(1).Columns("B:B").ClearContents
    For i = 0 To UBound(dic)
       If Len(dic(i)) = n Then
         For j = 1 To Len(dic(i))
            If InStr(1, s, Mid(dic(i), j, 1)) = 0 Then GoTo m
         Next j
         k = k + 1
         Cells(k, 2) = dic(i)
m:     End If
    Next i
End Sub
Миниатюры
Ускорить работу программы  
1
0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 10
01.06.2016, 10:02  [ТС] 13
SoftIce, а где сам процесс составления слов из букв? с какого образца он ведет сверку в словаре?
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
01.06.2016, 11:04 14
Цитата Сообщение от РусланМухмадови Посмотреть сообщение
де сам процесс составления слов из букв? с какого образца он ведет сверку в словаре?
Слова не составляются.
Берем из словаря слово по порядку. Если его длина соответствует заданной, то проверяем по буквам. Если какой-то буквы нет в заданном наборе символов, то переходим к следующему слову, иначе добавляем его на лист Excel.
Для проверки я взял словарь из 15000 слов. Код отрабатывает практически "мгновенно" (такой субъективный анализ)
Есть же словари и побольше , но, я думаю, в любом случае быстродействие будет выше чем у Вас.
1
0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 10
01.06.2016, 14:19  [ТС] 15
SoftIce да не плохой вариант, значит нужно искать хороший словарь со всеми существующими словами.. И конечно же спасибо, за советы и замечания, попробую и с Вашим примером что - ни будь сотворить.

Добавлено через 1 час 12 минут
Хотя вот, все таки тоже есть над чем подумать... мне ведь нужно что бы если в наборе букв к примеру "пор", слово "поп" не выходило, ведь в наборе букв только одна буква "п"
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
01.06.2016, 19:20 16
Цитата Сообщение от РусланМухмадови Посмотреть сообщение
Хотя вот, все таки тоже есть над чем подумать... мне ведь нужно что бы если в наборе букв к примеру "пор", слово "поп" не выходило, ведь в наборе букв только одна буква "п"
Это можно очень легко реализовать.
1
5613 / 1596 / 415
Регистрация: 23.12.2010
Сообщений: 2,397
Записей в блоге: 1
02.06.2016, 11:44 17
Как и просил Руслан
анаграмма или анаграмма с остатком неиспользованных букв.
Visual Basic
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
Option Explicit
Option Compare Text
Sub Anagramma() '_CommandButton1_Click()
    Dim dic, S As String, i As Long, j As Long, n As Long, k As Long, q&, r&, sD$, Z$, sim$()
    'n = Val(TextBox1.Text): s = Trim$(TextBox2.Text)
    n = 5: S = "АРБУЗНЫЙ"
    ReDim sim(Len(S))
    ThisWorkbook.Sheets(1).Columns("B:B").ClearContents
    With Sheets("Slovo" & n) ' Ищем слова только на листе с нужным количеством букв
        dic = .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
    End With
    For i = 1 To Len(S)
        sim(i) = Mid$(S, i, 1)
    Next i
    For i = 1 To UBound(dic)
         Z = dic(i, 1)
         r = 0
         For j = 1 To Len(S)
            q = InStr(1, Z, sim(j))
            If q > 0 Then
                Z = Left(Z, q - 1) & Right(Z, Len(Z) - q)
                r = r + 1
                If r = n Then Exit For
            Else
                GoTo m
            End If
         Next j
         k = k + 1
         Cells(k, 2) = dic(i, 1)
m: Next i
End Sub
Вложения
Тип файла: rar Генератор_анаграмм.rar (125.0 Кб, 11 просмотров)
1
5613 / 1596 / 415
Регистрация: 23.12.2010
Сообщений: 2,397
Записей в блоге: 1
02.06.2016, 13:11 18
Предыдущий пост неверный.
Отдавался приоритет буквам в начале слова, хотя при заданном слове из 8 букв в новом слове из пяти букв может быть ни одной из первых 3 букв заданного слова.
Visual Basic
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
Option Explicit
Option Compare Text
Sub Anagramma() 'CommandButton1_Click()
    Dim dic, S$, i&, j&, n&, k&, q&, r&, LenS&, Z$, sim$()
    'n = Val(TextBox1.Text): s = Trim$(TextBox2.Text)
    S = [A5]
    n = [A7]
    LenS = Len(S)
    ReDim sim(LenS)
    ThisWorkbook.Sheets(1).Columns("B:B").ClearContents
    With Sheets("Slovo" & n) ' Ищем слова только на листе с нужным количеством букв
        dic = .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
    End With
    For i = 1 To LenS
        sim(i) = Mid$(S, i, 1)
    Next i
    For i = 1 To UBound(dic)
         Z = dic(i, 1)
         r = 0
         For j = 1 To LenS
            q = InStr(1, Z, sim(j))
            If q > 0 Then
                Z = Left(Z, q - 1) & Right(Z, Len(Z) - q)
                r = r + 1
                If r = n Then
                    k = k + 1
                    Cells(k, 2) = dic(i, 1)
                    Exit For
                End If
            ElseIf LenS - j < n - r Then
                Exit For
            End If
         Next j
    Next i
End Sub
Для заданного слова АГРОНОМ и n=5 находит список:
АРГОН
ГНОМА
ГОМАР
ГОМОН
ГОНОР
ГОРНО
ГРОНА
МАНГО
МАНОР
МАРГО
МАРОН
МНОГО
МОГАР
МОНГО
МОНРО
МОРГА
НОРМА
ОМОНА
ОНАГР
ОРГАН
ОРОНА
РОМАН

Некоторых слов я не знаю, слова с сайта http://poiskslov.com/
1
0 / 0 / 0
Регистрация: 30.05.2016
Сообщений: 10
02.06.2016, 13:18  [ТС] 19
KoGG, о, спасибо Вам за помощь.. буду разбираться, совмещать все советы и предложения.. слабоват я, что то в этом деле, для генерации слов решил использовать циклы, хотя со словарями конечно быстрее
0
5613 / 1596 / 415
Регистрация: 23.12.2010
Сообщений: 2,397
Записей в блоге: 1
02.06.2016, 16:32 20
Лучший ответ Сообщение было отмечено РусланМухмадови как решение

Решение

Собственно генератор без словарей.
(есть объект словарь , но это другое, использован вместо коллекции для исключения дубликации слов, так как например слово аргон может генерироваться из слова агроном 2 раза, используя "о" с 4-ой позиции и с 7 позиции слова агроном).
За счет использования рекурсии и выбора только из оставшихся букв достаточно быстрый.
Visual Basic
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
Sub Anagramma()
    Dim i%, razmer%, kolbukv%, strok$, sim, sTemp, slovo$, schet&, vX, Dic As Object
    strok = [A5]
    razmer = [A7]
    kolbukv = Len(strok)
    ReDim sim(kolbukv)
    For i = 1 To kolbukv
        sim(i) = Mid$(strok, i, 1)
    Next i
    Application.ScreenUpdating = False
    ThisWorkbook.Sheets(1).Columns("B:B").ClearContents
    Set Dic = CreateObject("Scripting.Dictionary"): Dic.CompareMode = 1
    SlovoRecurs slovo, razmer, kolbukv, sim, Dic
    For Each vX In Dic.Keys
        schet = schet + 1
        Cells(schet, 2) = vX
    Next
End Sub
 
Sub SlovoRecurs(ByVal slovo$, razmer%, kolbukv%, sim, Dic As Object)
    Dim i%, sTemp, LenSlovo%, Slovo2$
    LenSlovo = Len(slovo)
    If LenSlovo >= razmer Then Exit Sub
    For i = 1 To kolbukv
        If sim(i) <> "" Then
            If LenSlovo = razmer - 1 Then
               If Application.CheckSpelling(slovo & sim(i), , False) Then
                   Dic(slovo & sim(i)) = 0&
               End If
            Else
                sTemp = sim
                Slovo2 = slovo & sim(i)
                sTemp(i) = ""
                SlovoRecurs Slovo2, razmer, kolbukv, sTemp, Dic
            End If
        End If
    Next i
End Sub
Вложения
Тип файла: rar Генератор_анаграмм2.rar (20.3 Кб, 29 просмотров)
2
02.06.2016, 16:32
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2016, 16:32
Помогаю со студенческими работами здесь

Ускорить работу программы
// 1-й вариант using System; using System.Net; using System.Collections.Generic; using...

Нужно ускорить работу программы
m=int(input()) a=input().split() b= d=0 for i in range(len(a)): b.append((2**i)/int(a))...

Ускорить работу программы с Excel
Доброго времени суток! Проблема такова: Есть программа на вход которой подаются 2 файла ексель с...

Как ускорить работу программы
Доброго времени суток! Разработал первую программу для logo! на FBD. На симуляторе все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru