У меня есть квадратная матрица, содержащая целые числа (не обязательно различные). Мне нужен самый быстрый способ найти в нем количество отдельных элементов. Я попытался сохранить целые числа в массиве 1D, отсортировал его, а затем нашел количество отдельных элементов ... но, по-видимому, он не достаточно быстр. Не могли бы вы предложить лучшую и быструю процедуру на языке C?Самый быстрый способ нахождения числа различных элементов в массиве
ответ
Что будет быстро очень зависит от данных, которые вы имеете дело с, размеры структур, вовлеченных и т.д.
Есть ли у вас ограничения на значения целых чисел можно взять? Если это так, то сохранение массива, проиндексированного целым значением, инициализированное нулями, которое отслеживает, сколько копий этого значения находится в матрице, вероятно, будет самым быстрым и разумным по использованию пространства.
Если нет, то, возможно, использование хеш-таблицы, чтобы сделать что-то подобное, будет самым быстрым.
Но в любом случае более точные параметры проблемы будут очень полезными.
Ну, у меня есть самая близкая матрица 300x300 ... какой метод вы предлагаете? – user3083162
Значения ограничены? –
Перефразировка «ограничены значениями?» - у вас есть минимальное и максимальное значение, которые достаточно близки (например, все числа от 0 до 100)? – ugoren
Обычно для любого алгоритма существует компромисс между скоростью, памятью и сложностью. Как говорили другие, чем больше информации вы знаете о своих данных, тем быстрее вы сможете сделать свой алгоритм. Скажем, у вас были номера от 1 до 100 (в качестве примера), вы могли бы действительно оптимизировать алгоритм с помощью этой информации.
Я нашел время, чтобы написать пример алгоритма, который является общим для любого набора данных. Это предполагает, что ваш размер набора достаточно мал или у вас достаточно доступной памяти. В основном короткая версия состоит в том, чтобы выделить массив с таким количеством элементов, как исходный двухмерный массив. Затем вы перебираете исходный массив и отбрасываете уникальные элементы в поля в новом массиве. Наконец подсчитать количество элементов в новом массиве:
#include <stdio.h> /* printf, scanf, puts, NULL */
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
typedef int bool;
#define TRUE 1
#define FALSE 0
/* The actual algorithm function - finds the number of unique values */
int NumberUniqueValues(int **array, int width, int height)
{
int i = 0, j = 0, k = 0, maxFilled = 0;
bool wasFound = FALSE;
int *newElements = malloc(sizeof(int) * width * height);
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
wasFound = FALSE;
for (k = 0; k < maxFilled; k++) {
if (newElements[k] == array[i][j]) {
wasFound = TRUE;
break;
}
}
if (!wasFound) newElements[maxFilled++] = array[i][j];
}
}
/* Free space */
free(newElements);
return maxFilled;
}
int main()
{
/* variables */
int i = 0, j = 0;
int originalWidth = 10;
int originalHeight = 10;
/* initialize array */
int **originalArray = (int **)malloc(originalHeight * sizeof(int*));
for (i = 0; i < originalHeight; i++) {
originalArray[i] = (int *)malloc(originalWidth * sizeof(int));
}
/* initialize random seed, then fill with random values */
srand (time(NULL));
for (i = 0; i < originalHeight; i++) {
for (j = 0; j < originalWidth; j++) {
originalArray[i][j] = rand() % 100;
}
}
printf("Number unique values: %d\n", NumberUniqueValues(originalArray, originalWidth, originalHeight));
/* Free space */
for (i = 0; i < originalHeight; i++) free(originalArray[i]);
free(originalArray);
return 0;
}
Опять же, это может быть не самый быстрый алгоритм для случая, так как я не знаю всех деталей, но это будет по крайней мере, работа. Удачи!
Это сложность выполнения O (n * m), где n = количество записей матрицы, и m = количество отдельных записей. Это будет работать довольно быстро (почти как можно быстрее), если, скажем, в матрице очень мало отдельных записей, но будет медленным, если элементы матрицы довольно часто различаются. Как отмечалось выше, чтобы выяснить, как быстро решить проблему OP, важно узнать больше о проблеме. –
Абсолютно согласен. Если вы заметите, мой тестовый пример был создан с использованием «rand()», что должно привести к главным образом уникальным значениям. –
ai ai ai - избавиться от этой петли k! – bph
ограниченное множество целочисленных значений 0-99
матричный размер 300 х 300
int array[100];
int i;
int j;
int n_unique = 0;
for (i=0;i<300;i++) {
if (n_unique == 100) break;
for (j=0;j<300;j++) {
if (array[mat[i][j]] == 0) {
array[mat[i][j]] = 1;
n_unique++;
if (n_unique == 100) break;
}
}
}
алгоритм O (п)
Во-первых, это зависит от того, как вы относитесь ваш массив. Если он динамический или нет, вы можете использовать массив 2d как массив 1d, потому что статический массив 2d массива IS 1d и динамический массив могут быть созданы как 1d-массив.
const int M = 100;
const int N = 200;
int **a = NULL;
int i, j;
a = (int**) malloc(M * sizeof(int*) + N * M * sizeof(int));
a[0] = (int*)(a + M);
for (i = 1; i < M; i++) {
a[i] = a[0] + i * N;
}
//code
free(a);
и
a[i][j] === a[0][i*num_of_columns + j]
так, 2 алгоритмы для 1d массивов
typedef int T;
#define EQ(a, b) ((a)==(b))
void quadDiff(T *a, size_t *out_size) {
size_t i, j;
size_t size = *out_size;
size_t pos = 0;
int unique;
for (i = 0; i < size; i++) {
unique = 1;
for (j = i; j > 0; j--) {
if (EQ(a[i], a[j-1])) {
unique = 0;
break;
}
}
if (unique) {
a[pos++] = a[i];
}
}
*out_size = pos;
}
и
void sortDiff(T *a, size_t item_size, size_t *out_size, int (*cmp)(const void *, const void *)) {
size_t i;
T prev = a[0];
size_t pos = 0;
qsort(a, *out_size, item_size, cmp);
for (i = 0; i < *out_size; i++) {
if (EQ(prev, a[i])) {
continue;
}
prev = a[i];
a[pos++] = a[i];
}
*out_size = pos;
}
Я хотел бы предложить следующий подход:
- Создайте hashmap над значениями в матрице.
- Возвращает размер hashmap.
Временная сложность этой проблемы будет порядка времени, необходимого для создания хэш-карты. Это не требует сортировки и будет более эффективным, чем подход, который вы используете. Этот подход не зависит от диапазона входных данных, что делает его более общим.
(Я не умею реализовывать материал на C) Я буду включать Java-код, который демонстрирует подход.
class Distinct {
public static void main(String ar[]) {
int size;
int matrix[][] = new int[size][size];
// POPULATE THE MATRIX BY IMPLEMENTING CUSTOM METHOD
populate(matrix);
// ALGORITHM:
HashMap<Integer,Boolean> distinct = new HashMap<Integer,Boolean>();
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
distinct.put(matrix[i][j],true);
}
}
System.out.println("Number of distinct elements:"+distinct.size());
}
}
Указатели на реализацию HashMap в C можно найти здесь: Implementing a HashMap
Я надеюсь, что это помогает!
- 1. Самый эффективный способ нахождения отсутствующего целого числа в массиве
- 2. Самый быстрый способ найти 2 недостающих числа в массиве
- 3. Самый быстрый способ подсчета различных элементов в двух длинных векторах
- 4. Самый быстрый способ найти дубликат в массиве
- 5. Самый быстрый способ определения смещения в массиве
- 6. Самый быстрый способ получить количество уникальных элементов в массиве javascript
- 7. Самый быстрый способ сравнить числа в php
- 8. Самый быстрый способ создания элементов HTML?
- 9. Самый быстрый способ поиска результата в массиве
- 10. быстрый алгоритм нахождения суммы в массиве
- 11. Самый быстрый способ подсчета числа вхождений строки
- 12. Самый быстрый способ найти факторы заданного числа
- 13. Самый быстрый способ расчета матричных элементов
- 14. Самый быстрый способ подсчета элементов, соответствующих предикату
- 15. Каков самый быстрый способ сделать объекты уникальными в массиве?
- 16. Самый быстрый способ сопоставить большое количество longs
- 17. Быстрый способ найти самый большой массив в многомерном массиве?
- 18. Каков самый быстрый способ подсчета числа раз, когда все элементы в массиве встречаются в строке?
- 19. Самый быстрый способ смешивания массивов в numpy?
- 20. Самый быстрый способ перемещения или поиска элементов в DIV HTML
- 21. Самый быстрый способ найти уникальные значения в массиве
- 22. Самый быстрый способ извлечь k различных элементов из n пар в R
- 23. Элегантный способ нахождения всех индексов целочисленных элементов в массиве MATLAB?
- 24. Числа различных элементов MongoDB
- 25. Самый быстрый способ преобразования целого числа в строку в java
- 26. Самый быстрый способ импорта?
- 27. Самый быстрый способ взять
- 28. Самый быстрый способ Алгоритм
- 29. Быстрый поиск количества элементов в массиве
- 30. Какой самый быстрый способ получить частичное значение числа в C#?
Каковы ограничения значений? Являются ли значения положительными? Есть ли максимум? – Michael