Моя программа часто имеет дело с большими объемами данных, и один ее конкретный компонент создает подмножество этих данных на основе условия.Вы можете рассматривать это как строку "
10457038005502
". Проблема состоит в том, чтобы вернуть первые пять (скажем) ненулевых элементов, то есть:
14573
InНа самом деле каждый элемент этой строки представляет собой большую структуру данных, содержащую значительный объем данных, причем весь набор данных часто составляет несколько гигабайт и содержит десятки тысяч элементов, и , чтобы выяснить, является ли элементдолжен быть включен (не '0') каждый элемент должен быть обработан.Я сформулировал это, как и выше, как для того, чтобы попытаться объяснить это четко, так и для того, чтобы сосредоточить внимание на алгоритмах или методах, а не на нашей конкретной реализации и данных.
- Править: Спасибо тем, кто ответил до сих пор.Все предложения вращаются вокруг многопоточности, что, я согласен, является хорошим подходом (и у нас есть многопоточная структура задач, в которую можно было бы вписаться.) Я надеялся, что саму проблему можно трактовать как алгоритмическую проблему - я подозреваю, что я неНе знаю, что это общая проблема, применимая к поиску по всем видам данных.В этом свете удивительным ответом было бы: «Шварценеггер и др. Предложили алгоритм X для этого в 1995 году, Google этот термин».
Наш текущий подход - однопоточный линейный поиск с первой точки, которую мыМы уже знаем во входном наборе данных, вдоль массива, вычисляем, нужно ли сохранять элемент или нет, и строим результаты по мере продвижения.Часто запрашиваемое подмножество данных находится не в начале - на примере строки вам может понадобиться, скажем, элементы 8-15 (если существует 15, которых вы можете не знать, пока не достигнете конца входных данных).) Конечно, мы не знаем, какой элемент 8 выходного набора данных находится во входном наборе данных, пока не обработаем это так далеко от начала.
Как еще мы должны решить эту проблему?
Я ищу информацию о любых совершенно разных подходах или алгоритмах для решения этой проблемы.
Какие есть другие подходы к этой проблеме, то есть быстрое получениепроизвольное подмножество?
Зная, что текущее решение связано с вычислениями из-за объема обработки на элемент, или, скорее, потому что он требует, чтобы каждый элемент был сгенерирован, чтобы исследовать егоПосмотрите, если это «0», какие алгоритмы или подходы вы могли бы предложить для решения проблемы?Есть ли способ минимизировать работу, выполняемую программой?
Если это влияет на конкретные библиотеки или инструменты, мы используем C ++ (не управляемый; мы используем Embarcadero C ++ Builder 2010 * .) Например, мы не можем использовать LINQ, который, без его использования, я думаю, мог бы быть полезным инструментом / языковой функцией для такого рода проблем.Однако мы, конечно, можем реализовать любые алгоритмические решения, которые вы обычно можете реализовать с меньшими затратами труда в другой среде.