Так от задачи зависит, первое что приходит в голову, это использовать не массив а хэш...gershte писал(а):
Видел решение извращенное выше? Работать будет быстрее чем цикл?
Индекс элемента в массиве. VB6
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- Marmot
- Графоман
- Сообщения: 39283
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация:
Re: Индекс элемента в массиве. VB6
- Дима
- Маньяк
- Сообщения: 1455
- Зарегистрирован: 15 авг 2006, 10:21
- Откуда: Минск->Vancouver->Victoria
Re: Индекс элемента в массиве. VB6
Точно. Если в массиве часто нужно получать индекс, используя значение элемента в качестве критерия для поиска, то структура данных выбрана неудачно. Если о базе данных спрашивать неприлично, то хэш - отличное решение проблемыMarmot писал(а):Так от задачи зависит, первое что приходит в голову, это использовать не массив а хэш...

-
- Маньяк
- Сообщения: 2026
- Зарегистрирован: 13 мар 2007, 22:55
Re: Индекс элемента в массиве. VB6
и реализовать его на перле, благо он там встроенный тип данныхДима писал(а):Точно. Если в массиве часто нужно получать индекс, используя значение элемента в качестве критерия для поиска, то структура данных выбрана неудачно. Если о базе данных спрашивать неприлично, то хэш - отличное решение проблемыMarmot писал(а):Так от задачи зависит, первое что приходит в голову, это использовать не массив а хэш...

- Stanislav
- Mr. Minority Report
- Сообщения: 45271
- Зарегистрирован: 19 окт 2005, 16:33
- Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo
Re: Индекс элемента в массиве. VB6
Любые извращения будут работать медленнее. Как вы думаете, какова внутренняя реализация команды инстринг? Тот же самый цикл?gershte писал(а):Видел решение извращенное выше? Работать будет быстрее чем цикл?
-
- Маньяк
- Сообщения: 2026
- Зарегистрирован: 13 мар 2007, 22:55
Re: Индекс элемента в массиве. VB6
я прошу прощение за невежество - последний раз что-то писал на васике лет 10 назад, но вот объект Dictionary,
позволяющий слепить ассоциативный массив не поможет решить вашу задачу? Разумеется быстрота зависит от реализации, но вдруг?
http://vb.mvps.org/hardweb/mckinney2b.htm
позволяющий слепить ассоциативный массив не поможет решить вашу задачу? Разумеется быстрота зависит от реализации, но вдруг?
http://vb.mvps.org/hardweb/mckinney2b.htm
-
- Житель
- Сообщения: 628
- Зарегистрирован: 19 фев 2007, 15:59
Re: Индекс элемента в массиве. VB6
Реализация может быть и на цикле. Вот только интерпретатор уже не на бэйсике. Поэтому вполне возможно что работать будет быстрее. Посмотрим.Stanislav писал(а):Любые извращения будут работать медленнее. Как вы думаете, какова внутренняя реализация команды инстринг? Тот же самый цикл?gershte писал(а):Видел решение извращенное выше? Работать будет быстрее чем цикл?
-
- Житель
- Сообщения: 628
- Зарегистрирован: 19 фев 2007, 15:59
Re: Индекс элемента в массиве. VB6
Спасибо. Посмотрим.meser писал(а):я прошу прощение за невежество - последний раз что-то писал на васике лет 10 назад, но вот объект Dictionary,
позволяющий слепить ассоциативный массив не поможет решить вашу задачу? Разумеется быстрота зависит от реализации, но вдруг?
http://vb.mvps.org/hardweb/mckinney2b.htm
-
- Графоман
- Сообщения: 18705
- Зарегистрирован: 20 июл 2003, 09:16
- Откуда: Торонто
Re: Индекс элемента в массиве. VB6
Циклы реализуются по-разному.Stanislav писал(а):Любые извращения будут работать медленнее. Как вы думаете, какова внутренняя реализация команды инстринг? Тот же самый цикл?
Знаю ребят, которые довольно сложную программу (лет этак 10 назад) писали по следующей технологии:
1. Все бизнес вычисления и преобразования написаны на С и скомпилированы в DLL.
2. Все диалоговые окна созданы с помощью VB.
Таким образом были просуммированы преимущества в виде высокой скорости обработки данных и высокой скорости разработки приложения.
- Stanislav
- Mr. Minority Report
- Сообщения: 45271
- Зарегистрирован: 19 окт 2005, 16:33
- Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo
Re: Индекс элемента в массиве. VB6
Ну даже и так, но это по любому call - вы будете пушать и попать регистры, делать фар джампы...tasko писал(а):Циклы реализуются по-разному.Stanislav писал(а):Любые извращения будут работать медленнее. Как вы думаете, какова внутренняя реализация команды инстринг? Тот же самый цикл?
Знаю ребят, которые довольно сложную программу (лет этак 10 назад) писали по следующей технологии:
1. Все бизнес вычисления и преобразования написаны на С и скомпилированы в DLL.
2. Все диалоговые окна созданы с помощью VB.
Таким образом были просуммированы преимущества в виде высокой скорости обработки данных и высокой скорости разработки приложения.
to meser:
Если юзать object - то это вообще засада - особенно ежели виртуальные функции вызывать...
- Marmot
- Графоман
- Сообщения: 39283
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация:
Re: Индекс элемента в массиве. VB6
Ежели использовать правильную VM/JIT - Java или тот же .NET много чего будет инлайниться/оптимизироваться...Stanislav писал(а):Ну даже и так, но это по любому call - вы будете пушать и попать регистры, делать фар джампы...tasko писал(а):Циклы реализуются по-разному.Stanislav писал(а):Любые извращения будут работать медленнее. Как вы думаете, какова внутренняя реализация команды инстринг? Тот же самый цикл?
Знаю ребят, которые довольно сложную программу (лет этак 10 назад) писали по следующей технологии:
1. Все бизнес вычисления и преобразования написаны на С и скомпилированы в DLL.
2. Все диалоговые окна созданы с помощью VB.
Таким образом были просуммированы преимущества в виде высокой скорости обработки данных и высокой скорости разработки приложения.
to meser:
Если юзать object - то это вообще засада - особенно ежели виртуальные функции вызывать...
- AlexANB
- Маньяк
- Сообщения: 2904
- Зарегистрирован: 17 фев 2003, 18:47
- Откуда: Ontario
Re: Индекс элемента в массиве. VB6
Так-сь... Ну, однозначно, поиск байта, слова или еще чего кратного машинному представлению чего-нить будет куда быстрее, чем поиск элемента в массиве.
В первом случае есть даже команда процессора, которая делает это на хардверном уровне, во втором мы имеем кучу геморроя с вычислением адреса элемента в массиве плюс куча прочих операций.
Но в конце-концов, если даже и это недостаточно быстро по причине того, что какой-нить идиет реализовал это в васике через задницу, остается еще один путь -- искать совпадение пришедшего евента с элементом массива просто путем деления отрезка пополам. Разумеется, массив для сравнения должен быть отсортирован, но поскольну он фиксированный и не меняется, это надо сделать только один раз, еще на стадии компиляции аппликухи.
Потом место для пришедшего евента будет найдено в массиве за время равное корню квадратному из количества элементов в массиве (да, знаю, что коряво сказал, но вы поняли, да?)
В первом случае есть даже команда процессора, которая делает это на хардверном уровне, во втором мы имеем кучу геморроя с вычислением адреса элемента в массиве плюс куча прочих операций.
Но в конце-концов, если даже и это недостаточно быстро по причине того, что какой-нить идиет реализовал это в васике через задницу, остается еще один путь -- искать совпадение пришедшего евента с элементом массива просто путем деления отрезка пополам. Разумеется, массив для сравнения должен быть отсортирован, но поскольну он фиксированный и не меняется, это надо сделать только один раз, еще на стадии компиляции аппликухи.
Потом место для пришедшего евента будет найдено в массиве за время равное корню квадратному из количества элементов в массиве (да, знаю, что коряво сказал, но вы поняли, да?)
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
Re: Индекс элемента в массиве. VB6
С легкостью необычайной. Это, кстати, очень известный способ оптимизации коротких циклов. Ограничения, разумеется, есть, но при известном трудолюбии можно преодолеть (не знаю только, зачем):Marmot писал(а):Ну-ка, ну-ка и как это можно сделать на С/С++ не используя цикл?
int GetArrayIndex( int* array, int size, int value )
{
assert( size < 10 );
switch( size )
{
case 10:
if (array[9] == value) return 9;
case 9:
if (array[8] == value) return 8;
case 8:
if (array[7] == value) return 7;
case 7:
if (array[6] == value) return 6;
case 6:
if (array[5] == value) return 5;
case 5:
if (array[4] == value) return 4;
case 4:
if (array[3] == value) return 3;
case 3:
if (array[2] == value) return 2;
case 2:
if (array[1] == value) return 1;
case 1:
if (array[0] == value) return 0;
}
return -1;
}
Деда, только не восприми буквально. Это я типа выпендриваюсь.
Hashtable - твое спасение. В VB они кажется называются Dictionaries. Но могу ошибаться - я его не знаю. И знать не хочу, что характерно.
- AlexANB
- Маньяк
- Сообщения: 2904
- Зарегистрирован: 17 фев 2003, 18:47
- Откуда: Ontario
Re: Индекс элемента в массиве. VB6
Не, ты вообще не въехал в суть задачи. Впрочем, автор топика ее и не поставил так, чтобы можно было въехать. Понять, что на самом деле требуется можно только после уточнений, которых тут нет.sz писал(а):С легкостью необычайной. Это, кстати, очень известный способ оптимизации коротких циклов. Ограничения, разумеется, есть, но при известном трудолюбии можно преодолеть (не знаю только, зачем):Marmot писал(а):Ну-ка, ну-ка и как это можно сделать на С/С++ не используя цикл?
int GetArrayIndex( int* array, int size, int value )
{
assert( size < 10 );
switch( size )
{
case 10:
if (array[9] == value) return 9;
case 9:
if (array[8] == value) return 8;
case 8:
if (array[7] == value) return 7;
case 7:
if (array[6] == value) return 6;
case 6:
if (array[5] == value) return 5;
case 5:
if (array[4] == value) return 4;
case 4:
if (array[3] == value) return 3;
case 3:
if (array[2] == value) return 2;
case 2:
if (array[1] == value) return 1;
case 1:
if (array[0] == value) return 0;
}
return -1;
}
Деда, только не восприми буквально. Это я типа выпендриваюсь.
Hashtable - твое спасение. В VB они кажется называются Dictionaries. Но могу ошибаться - я его не знаю. И знать не хочу, что характерно.
А суть такая: имеем массив с туевой хучей всяких элементов. Один из из этих элементов выглядит как текст "Bob-Sam" или что-то подобное -- это и есть ключ, индекс, по которому будем искать, остальные элементы -- цифровые (как целые, так и плавающие). Эти остальные нас сейчас не интересуют, туда просто будет записана новая информация из прищедшего евента.
Из внешнего мира приходит евент, у которого один элемент тоже равен "Bob-Sam", но может быть и другим -- исходный массив тоже состоит из (возможно) сотни-другой таких вот строк.
Соответственно, надо найти, в какую именно строку существующего массива надо писать новый евент. Сравнивать по тому самому текстовому элементу.
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
Re: Индекс элемента в массиве. VB6
Да все я понял с самого начала.
Тебе же говорят - hashtable.
Если элементов неконтролируемо много, то binary tree может оказаться эффективнее. Но скорее всего, стандартного хеша тебе за глаза хватит. Даже без игр с алгоритмами хеширования.
Тебе же говорят - hashtable.
Если элементов неконтролируемо много, то binary tree может оказаться эффективнее. Но скорее всего, стандартного хеша тебе за глаза хватит. Даже без игр с алгоритмами хеширования.
-
- Маньяк
- Сообщения: 2026
- Зарегистрирован: 13 мар 2007, 22:55
Re: Индекс элемента в массиве. VB6
Ну если это так, то Мармот прав - это типичнаая задача для ассоциативного массива (хэша), который в перл используется очень широко и для ВБ сделали объект Dictionary, как раз по мотивам перла.AlexANB писал(а):Не, ты вообще не въехал в суть задачи. Впрочем, автор топика ее и не поставил так, чтобы можно было въехать. Понять, что на самом деле требуется можно только после уточнений, которых тут нет.
....
Соответственно, надо найти, в какую именно строку существующего массива надо писать новый евент. Сравнивать по тому самому текстовому элементу.