Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Произвольная адресация элементов массива

04.03.2019, 09:51. Показов 4678. Ответов 86
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например
C#
1
int[] a = new int[5];
даст нам индексы 0..4, а как быть если набор индексов определяется какими-то условиями, например у меня при работе с битами удобно было бы обращаться к элементам по индексам 1, 2, 4, 8, 16, 32 - каким образом это оформляется? чтобы не пришлось делать лишних 26 элементов массива.
или вариант с хешами, где индексом массива является большое число, а самих элементов может быть немного.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.03.2019, 09:51
Ответы с готовыми решениями:

STL: контейнеры. Произвольная вставка элементов
Доброго времени суток! Можно ли вставить элемент в контейнер STL (не важно какой) в произвольное место? Имеется в виду, в случаи...

Поэлементная адресация непрерывного массива
Привет, народ! Хочется красивого кода без лишних комментариев. Может кто-то подкинет идею, как реализовать обращение к частям непрерывного...

Не хотите ли немного магии? [адресация char] (обращение к масиву через элемент соседнего массива)
Небезызвестные крестики-нолики. Со вчера у меня Компьютер решил изменить свой алгоритм работы и вдруг поставил нолик там, где я его не...

86
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,235
04.03.2019, 10:00
Что шарп здесь делает?

Добавлено через 4 минуты
Цитата Сообщение от belalugoci Посмотреть сообщение
1, 2, 4, 8, 16, 32
- в C++ есть map - список пар или ассоциативных контейнеров, 1 пара - это {ключ, значение}, туда Вы можете занести свои числа в качестве ключа-строки.
0
35 / 28 / 8
Регистрация: 01.03.2019
Сообщений: 135
04.03.2019, 10:12
belalugoci, может быть поможет чем-то я так понял, вы хотели работать не с битами, а байтами?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    int array[2] = { 0xAABBCCEE, 0xAADDBBCC };
    char* bytePtr = (char*)(array);
 
    for (int i = 0; i < sizeof(array); i++, bytePtr++)
    {
        if (i > 0 && i % 4 == 0)
            printf("\n");
        printf("%X", (unsigned char)*bytePtr);
    }
            
    return 0;
}
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
04.03.2019, 10:15  [ТС]
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Что шарп здесь делает?
ошибся разделом.

Цитата Сообщение от ALast Посмотреть сообщение
может быть поможет чем-то я так понял, вы хотели работать не с битами, а байтами?
не суть с чем я хотел работать, я говорю об индексах элементов массива.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
04.03.2019, 11:03
Лучший ответ Сообщение было отмечено belalugoci как решение

Решение

Цитата Сообщение от belalugoci Посмотреть сообщение
не суть с чем я хотел работать, я говорю об индексах элементов массива.
Используйте словарь. В данном случае типа Dictonary<int, bit> (bit условно).
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
04.03.2019, 11:10  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Используйте словарь. В данном случае типа Dictonary<int, bit> (bit условно).
ведь сам пользовался словарем, но давно, забыл напрочь. Спасибо вам в очередной раз.
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,902
04.03.2019, 11:14
belalugoci, самым эффективным решением будет именно массив с пустыми (ненужными) элементами. Обратиться к такой структуре будет на порядки быстрее, чем использовать хеш-таблицу (Dictonary).

Добавлено через 3 минуты
Или можно использовать таблицу поиска:

C#
1
static int[] lookup = new [] { 1, 2, 4, 8, 16, 32 };
В данном случае, позиция элемента в массиве будет индексом для другой таблицы. Перебрать такой массив в поиске "32" будет мгновенно даже в сравнении с хеш-таблицей. Если значений будет сильно много, то такое уже может не быть столь эффективным.
1
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
04.03.2019, 11:18
Можно еще обертку сделать со своим индексатором:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyArray
{
    private int[] _data;
    public MyArray(int length)
    {
         _data = new int[length];
    }
    public int this[int index]
    {
        get { return _data[(int)Math.Log(index,2)]; }
        set { _data[(int)Math.Log(index,2)] = value; }
    }
}
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
04.03.2019, 11:33  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
самым эффективным решением будет именно массив с пустыми (ненужными) элементами
понимаю и думаю вероятно так и сделаю, думаю даже при 65К элементов это будет только 64 Кб.

Цитата Сообщение от Usaga Посмотреть сообщение
Или можно использовать таблицу поиска
да, второй вариант к рассмотрению и наверное самый понятный мне и удобный.

Цитата Сообщение от Usaga Посмотреть сообщение
Перебрать такой массив в поиске "32" будет мгновенно даже в сравнении с хеш-таблицей
если честно я думал что Dictionary и есть реализация предыдущего варианта, поэтому не думал что скорость будет низкой настолько.

Цитата Сообщение от Toros1992 Посмотреть сообщение
Можно еще обертку сделать со своим индексатором
приму к сведению, но считать Math.Log "размер файла"/512*4096 раз наверное будет накладно...
0
Эксперт .NET
 Аватар для Usaga
14078 / 9295 / 1347
Регистрация: 21.01.2016
Сообщений: 34,902
04.03.2019, 11:39
Цитата Сообщение от belalugoci Посмотреть сообщение
если честно я думал что Dictionary и есть реализация предыдущего варианта, поэтому не думал что скорость будет низкой настолько.
Скорость будет высокой. Но прямая работа с массивом - ещё быстрее. В случае с хеш-таблицей, нужно посчитать хеш числа, найти вхождение во внутреннем списке бакетов, найти бакет с нужным значением. Согласитесь, что этот путь чуть длиннее, чем пять элементов в лоб перебрать.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
04.03.2019, 12:25
Цитата Сообщение от belalugoci Посмотреть сообщение
вероятно так и сделаю, думаю даже при 65К элементов это будет только 64 Кб.
Зависит от задачи в целом.

Если элементов не много, то лучше не заморачиваться и сделать массив с неиспользуемыми элементами.

Если элементов много и почти пустой массив делать накладно, то надо ещё обратить внимание на, то постоянная это коллекция или изменяемая.

Если постоянная, то довольно высокую скорость даст обычный отсортированный List и бинарный поиск по нему.

Если изменяемая но редко, то нужна коллекция поддерживающая динамическую сортировку.

Если часто меняемая, то это надо проверять различные варианты, так как много факторов может оказать влияние.
Тот же самый индекс - это произвольные номера или, именно, степень двойки? Можно оптимизировать алгоритм создания индексов и обращения к элементам.
Ну, т.д. и т.п.

Добавлено через 3 минуты
Словарь имеет преимущество не в скорости - это довольно медленная коллекция.
Его преимущество - прозрачность, удобность в использовании. Если скорость не является основным критериям, то лучше использовать словарь.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
04.03.2019, 16:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Зависит от задачи в целом.
пока сделал через int a, который читаю как a & 1, a & 2 ... a & 32 и т.п. вариации на тему битов. Не нравится, но написал быстро. Сейчас хочу понять порядок скорости. Но в целом всё медленно, 12 мб обрабатываю за 19 секунд. Когда можно 2-3 гб обрабатывать за 1-2 секунды.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
04.03.2019, 17:04
Цитата Сообщение от belalugoci Посмотреть сообщение
Но в целом всё медленно, 12 мб обрабатываю за 19 секунд. Когда можно 2-3 гб обрабатывать за 1-2 секунды.
Дело, наверное, не в выборке из массива, а в обработке.
Что за обработка у Вас?

Добавлено через 1 минуту
Цитата Сообщение от belalugoci Посмотреть сообщение
который читаю как a & 1, a & 2 ... a & 32 и т.п
До, какого размера? Какой последний бит?

Добавлено через 3 минуты
Если а = 3 какие действия?

- Такого по алгоритму быть не может.

- Надо вернуть по индексу 2

- Надо значения по индексу 1 и по индексу 2
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
04.03.2019, 21:05  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Дело, наверное, не в выборке из массива, а в обработке.
ищу вот такую фигню

Цитата Сообщение от Элд Хасп Посмотреть сообщение
До, какого размера? Какой последний бит?
пока 32

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если а = 3 какие действия?
такого не может быть

вообще не факт что это важно, это просто мои умозаключения на тему нескольких шаблонов и их идентификации. Из прошлых разных программ было однозначно установлено что есть несколько "фигур", "аномалий", не суть как называть - которые портят жизнь, это
C#
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
0100
0001
1000
0010
 
0010
1000
0001
0100
 
01000
00011
11000
00010
 
00010
11000
00011
01000
 
0100
0101
0000
1010
0010
 
0010
1010
0000
0101
0100
Есть еще, но я дальше 6 бит пока не вышел.

как видно это фигуры с зеркальным видом. Важно не только положение 1, но и 0 одновременно, то есть это три пары, для каждой пары с 1 соответствует пара с 0, с тем же расположением бит, то есть условно
C#
1
2
3
4
0100
0001
1000
0010
нужно рассматривать как
C#
1
2
3
4
0АБ0
Б00А
А00Б
0БА0
где А = 1
Б = 0
то есть для варианта
C#
1
2
3
4
0110
0001
1000
0010
уже не выполняется условие, а для
C#
1
2
3
4
1100
0001
1000
0010
всё нормально.
утром код опубликую, будет видно чего я там намудрил.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
05.03.2019, 09:51  [ТС]
вот сам код, в теле указывается путь к файлу, больше 20 Мб лучше не ставить - долго будет.
спрашивайте, расскажу что конкретно делается, мне сложно сориентироваться какого рода нужна информация для понимания моего бреда.
Вложения
Тип файла: 7z Matrix64GUI3.7z (164.5 Кб, 5 просмотров)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
05.03.2019, 12:36
belalugoci, трудно в таком коде разбираться....
Намешаны данные и отображение, не комментариев.
Из того что понял долго считается цикл
C#
88
89
90
91
92
93
94
95
96
97
98
                    do
                    {
                        XYcoord = SelectCoord(XYcoord);
                        if (XYcoord[0] >= 0)
                            for (template = 0; template < 6; template++)
                                if (SearchIcon2(XYcoord[0], XYcoord[1], XY, template))
                                {
                                    comparedCount++;
                                    tempMaxCount++;
                                }
                    } while (XYcoord[0] >= 0);
Добавлено через 7 минут
В это цикле собственно долго считается SearchIcon2(XYcoord[0], XYcoord[1], XY, template)

Добавлено через 39 секунд
Не могу понять логику функции
C#
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
        static bool SearchIcon2(int xa, int ya, int[,,] xy, int numTemplate) // поиск совпадений
        {
            for (int pos = 0; pos < xy.Length / 18; pos++)
            {
                int tempbit = xy[numTemplate, pos, 2];
                if (tempbit >= 0)
                {
                    int tempx = xa + xy[numTemplate, pos, 0];
                    int tempy = ya + xy[numTemplate, pos, 1];
                    if ((tempx > 63) || (tempy > 63)) return false;
                    byte pixel = (byte)(((buf[(tempy) * 8 + tempx / 8] & pow[7 - (tempx < 8 ? tempx : tempx % 8)]) == 0 ? 0 : 1));
                    if (pixel != tempbit) return false;
                }
                else return true;
            }
            return true;
        }
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
05.03.2019, 12:39  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
трудно в таком коде разбираться....
я чужое никогда не понимаю, поэтому для меня те, кто умеют читать чужой код как марсиане.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Намешаны данные и отображение
а как иначе?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
не комментариев
написать для каждой строки?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Из того что понял долго считается цикл
он самый

я сделал вариант еще, где исключаются из шести фигур в поиске те, которые точно не могу присутствовать в данной точке, но стало медленнее еще сильнее. текущий код для 12М файла исполняется 20 секунд, а после "оптимизации" стали почти 2 минуты. Выкладывать не стал, дал чуть более просто вариант, но он и более быстрый.

Добавлено через 30 секунд
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не могу понять логику функции
сейчас сделаю комментарии
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
05.03.2019, 12:43
Цитата Сообщение от belalugoci Посмотреть сообщение
а как иначе?
Почитайте за патерны MVC, MVP, MVVVM.
Сейчас для десктоп наиболее часто используется MVVM.

Цитата Сообщение от belalugoci Посмотреть сообщение
написать для каждой строки?
Хотя бы для блоков
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
05.03.2019, 12:54  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сейчас для десктоп наиболее часто используется MVVM
мне кажется это выльется в то, что для выкапывания ямы под нужник сначала строится электростанция, потом завод по производству роботов. собирается робот и он копает яму.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
05.03.2019, 12:58
Цитата Сообщение от belalugoci Посмотреть сообщение
мне кажется это выльется в то, что для выкапывания ямы под нужник сначала строится электростанция, потом завод по производству роботов. собирается робот и он копает яму.
Нет это не так.
Это выльется в то что не один человек занимается копанием ямы, получение разрешения на неё, откачкой "золота", его вывозом, ещё успевает сходить на работу, побухать и т.д.
А для каждого занятия есть свой человек.... А самому остаётся только "отдохнуть" с друзьями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.03.2019, 12:58
Помогаю со студенческими работами здесь

Что значит "Косвенная адресация к элементам массива"
Всем доброго времени суток!!! Кто может подсказать, что значит &quot;Косвенная адресация&quot; к элементам массива. *(B + i) = 0; ...

Произвольная вставка элементов в ArrayList
Всем привет. По заданию нужно сгенерировать 1_000_000 последовательных целых чисел и после записать их в коллекцию в произвольном порядке....

Может ли произвольная логическая схема быть построена только из логических элементов одного типа
Может ли произвольная логическая схема быть построена только из логических элементов одного типа? Ответ обосновать

Заполнить вектор значениями положительных элементов вектора C. Размерность вектора C произвольная
Заполнить вектор значениями положительных элементов вектора C. Размерность вектора C произвольная. Private Sub Command1_Click() Dim m...

Одномерные массивы. Вставка, удаление элементов массива. Перестановка элементов массива. Сортировка массива методом пузырька
Помогите пожалуйста! Дан массив, состоящий из N букв латинского алфавита а) Заполнить массив датчиком случайных чисел б)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru