Для меня все объяснения здесь были ужасны, так как я не получил часть поиска / сортировки. Как мы ищем / сортируем, было неясно.
Мы все знаем, что нам нужно построить prefixSum
, что означает sum of all elems from 0 to i with modulo m
Я думаю, то, что мы ищем, ясно. Зная, что subarray[i][j] = (prefix[i] - prefix[j] + m) % m
(с указанием суммы по модулю от индекса i до j), наши максимумы при заданном префиксе [i] всегда являются тем префиксом [j], который максимально приближен к префиксу [i], но немного больше.
например. для m = 8, префикс [i] равен 5, мы ищем следующее значение после 5, которое находится в нашем prefixArray.
Для эффективного поиска (бинарный поиск) мы сортируем префиксы.
Что мы не можем сделать, так это сначала построить prefixSum, а затем выполнить итерацию снова от 0 до n и искать индекс в отсортированном массиве префиксов, потому что мы можем найти и endIndex, который меньше, чем наш startIndex, что не годится.
Следовательно, мы делаем итерацию от 0 до n, указывая endIndex нашей потенциальной максимальной суммы подмассива, а затем просматриваем наш отсортированный префиксный массив (который в начале пуст), который содержит отсортированные префиксы между 0 и endIndex.
def maximumSum(coll, m):
n = len(coll)
maxSum, prefixSum = 0, 0
sortedPrefixes = []
for endIndex in range(n):
prefixSum = (prefixSum + coll[endIndex]) % m
maxSum = max(maxSum, prefixSum)
startIndex = bisect.bisect_right(sortedPrefixes, prefixSum)
if startIndex < len(sortedPrefixes):
maxSum = max(maxSum, prefixSum - sortedPrefixes[startIndex] + m)
bisect.insort(sortedPrefixes, prefixSum)
return maxSum
Я рекомендую вам использовать StreamHub Comet Server - его используют многие люди - лично я использую его с парой сайтов Django, которые я запускаю. Вам нужно будет написать крошечный кусочек Java для обработки потоковой передачи - я сделал это с помощью Jython . Интерфейсный код представляет собой действительно простой Javascript а-ля:
StreamHub hub = new StreamHub();
hub.connect("http://myserver.com/");
hub.subscribe("newsfeed", function(sTopic, oData) { alert("new news item: " + oData.Title); });
Документация довольно хороша - у меня были проблемы, похожие на те, что вы пытались начать с разреженными документами Cometd et al. Для начала я бы прочитал Начало работы с Comet и StreamHub , загрузите и посмотрите, как работают некоторые примеры, и обратитесь к документации API, если вам нужно:
Я этого не делал, но этот парень написал хорошую статью об этом, с примерами Django и указателями (которые я не проверял) на другие каркасы.
Я сделал множество API-интерфейсов, используя twisted для подобных вещей, большинство из которых доступно в моей учетной записи github .
Большинство из них - клиентские, но slosh - это сервер, который я написал, чтобы делать что-то вроде дешевых pubsub в реальном времени. Он немного масштабируется по горизонтали для чтения, позволяя выполнять простую потоковую репликацию. Запись немного отличается, когда вы придерживаетесь простого HTTP, но я протолкнул приличную сумму для демонстрации.
В противном случае у вас есть полноценный BOSH, который поддерживает большинство серверов XMPP и позволит вам разделить сообщение распространение из веб-интерфейса.
Orbited кажутся хорошим решением. Однако не пробовал.
Обновление : за последние 2,5 года все изменилось.
Теперь у нас есть веб-сокеты во всех основных браузерах, кроме IE (естественно), и пара очень хороших абстракций поверх него. , которые предоставляют множество методов эмуляции связи в реальном времени.
Вот полнофункциональный пример объединения Django, Orbited и Twisted для создания приложения реального времени (Comet): http://github.com/clemesha/hotdot с использованием Python.
решения orbited и redis хороши, но уже не актуальны, когда есть что-то вроде PubSubHubbub, который выпустил google. Это позволяет очень легко быть издателем или подписчиком данного фида. http://code.google.com/p/pubsubhubbub/
Вот пример, который выполняет длинный опрос с gevent и Django .
Он использует greenlet - функцию переключения стека из Stackless, упакованную как расширение CPython.