Как я могу эффективно извлечь повторенные элементы в массиве Ruby? [дубликат]

Отсрочка гарантирует, что каждый подписчик может получить свою собственную исходную последовательность, независимую от других подписчиков. Позвольте мне проиллюстрировать это двумя примерами:

AtomicInteger index = new AtomicInteger();

Flowable<String> source =
    Flowable.just("a", "b", "c", "d", "e", "f")
    .map(v -> index.incrementAndGet() + "-" + v)
    ;

source.subscribe(System.out:println);

source.subscribe(System.out:println);

отпечатков

1-a
2-b
3-c
4-d
5-e
6-f
7-a
8-b
9-c
10-d
11-e
12-f

против

Flowable<String> source =
    Flowable.defer(() -> {
        AtomicInteger index = new AtomicInteger();

        return Flowable.just("a", "b", "c", "d", "e", "f")
               .map(v -> index.incrementAndGet() + "-" + v)
               ;
    })
    ;

source.subscribe(System.out:println);

source.subscribe(System.out:println);

отпечатков

1-a
2-b
3-c
4-d
5-e
6-f
1-a
2-b
3-c
4-d
5-e
6-f

Во втором Например, существует состояние подписчика, которое в противном случае было бы разделено между всеми подписчиками. Теперь, поскольку каждый подписчик получает свою собственную индивидуальную последовательность, оба элемента индекса, как и следовало ожидать.

6
задан Jonathan Leffler 23 November 2013 в 06:14
поделиться

6 ответов

Вдохновленный ответом Ильи Хейкинсона:

def repeated(array)
  counts = Hash.new(0)
  array.each{|val|counts[val]+=1}
  counts.reject{|val,count|count==1}.keys
end
9
ответ дан 8 December 2019 в 05:23
поделиться

How about something like this? It will run in O(n).

a = [1,1,1,2,4,6,3,3]
b = {}
a.each { |v| if b.has_key? v then b[v] = b[v]+1 else b[v]=1 end }
b.reject { |k,v| if v > 1 then false else true end }.keys
4
ответ дан 8 December 2019 в 05:23
поделиться

Некоторые идеи: вам нужно выяснить правильные структуры данных библиотеки:

1 Сортировать массив O (nlogn), а затем пробежаться по массиву

2 Создать набор, найти текущий элемент массива в наборе и, если он не найден, вставить и продолжить для всех элементов - O (nlogn) снова.

0
ответ дан 8 December 2019 в 05:23
поделиться

AppDomains are useful when you have to have multiple instances of a singleton. For example, you have an assembly that implements a communication protocol to some device and this assembly uses singletons. If you want to instantiate multiple instances of this class (to talk to multiple devices) and you want the instances to not interfere with one another, then AppDomains are perfect for this purpose.

It does make programming more difficult, however, as you have to do more work to communicate across AppDomain boundaries.

--121 --- 1907030--

Было бы более разумно сгруппировать код, связанный с одним объектом. Таким образом, в этом случае, если представления представляют собой конкретные группы связанного кода, докладчик также будет имитировать эти группировки. Чтобы иметь «глобального» презентатора для разных представлений, нужно сгруппировать несвязанный код в один объект. Это определенно раздуло бы интерфейс и для докладчика. Ознакомьтесь с принципом единоличной ответственности .

Теперь у вас может быть один класс Presenter Manager, который, возможно, предоставит вам доступ к каждому интерфейсу презентатора, , как утверждает принцип разделения интерфейса , с помощью любого наследования (есть глобальный конкретный презентатор, который реализует множество интерфейсов презентатора). .. какой вид нарушает единственную ответственность) или агрегацию (наличие отдельных презентаторов для каждого интерфейса и функций get ... таким образом, глобальный интерфейс будет функциями get) или их комбинацию (глобальный презентатор является своего рода адаптером).

Я думаю, что лучшим решением было бы просто иметь 30 разных докладчиков.

--121 --- 2320369--

Если вы используете Sinatra, я не могу рекомендовать DataMapper достаточно высоко. У меня есть пара приложений Rails, где я застрял с ActiveRecord, и я постоянно ругаю его недостатки и недостатки дизайна. Если вы на Синатре, DataMapper - очень практичный выбор.

require "rubygems"
require "sinatra"
require "datamapper"

DataMapper.setup(:default, "sqlite3::memory:")

class Post
  include DataMapper::Resource

  property :id,    Integer, :serial => true
  property :title, String
end

Post.auto_migrate!
first_post = Post.new
first_post.title = "First!"
first_post.save

get "/" do
  Post.get(1).title
end
- 121 --- 1854244--

Ааа! Эти ответы очень не информированы!

Конечно, это не помогает, что вопрос неточный.

Хорошо, «рендеринг» - действительно широкая тема. Одной из проблем рендеринга является видимость камеры или «алгоритмы скрытой поверхности» - выяснение того, какие объекты видны в каждом пикселе. Существуют различные классификации алгоритмов видимости. Это , вероятно, , о чем спрашивал плакат (учитывая, что они думали об этом как о дихотомии между " Они были чертовски креативны с алгоритмами в те времена, когда было не так много вычислительных циклов и не хватало памяти для хранения z-буфера.

В наши дни и вычисления, и память дешевы, и поэтому три метода имеют довольно много выиграл: (1) нарезать все на треугольники и использовать z-буфер; (2) лучевое литье; (3) Рейесоподобные алгоритмы, которые используют расширенный z-буфер для обработки прозрачности и тому подобное. Современные видеокарты занимают первое место; рендеринг программного обеспечения высокого уровня обычно делает № 2 или № 3 или их комбинацию. Хотя было предложено, а иногда и построено различное оборудование для трассировки лучей, но оно так и не завоевало популярность, а также современные графические процессоры в настоящее время достаточно программируемы, чтобы фактически отслеживать трассировку, хотя и с серьезным недостатком скорости по сравнению с их жестко закодированными методами растеризации. Другие, более экзотические алгоритмы, в основном, отошли на второй план за эти годы. (Хотя различные алгоритмы сортировки / разбрызгивания могут использоваться для объемного рендеринга или других специальных целей.)

«Растеризация» на самом деле означает «выяснение, на каких пикселях лежит объект». Конвенция предписывает, что она исключает трассировку лучей, но это шатко. Я полагаю, вы могли бы оправдать, что растеризация отвечает «какие пиксели перекрывают эту форму», тогда как трассировка лучей отвечает «какой объект находится за этим пикселем», если вы видите разницу.

Итак, удаление скрытой поверхности - не единственная проблема для решаться в области «рендеринга». Знание того, какой объект виден в каждом пикселе, - это только начало; Вы также должны знать, какого это цвета, что означает наличие некоторого метода вычисления того, как свет распространяется по сцене. Есть целый ряд методов, обычно разбивается на работу с тенями, отражениями и «глобальным освещением» (то, что отражается между объектами, а не идет непосредственно от источников света).

«Трассировка лучей» означает применение метода приведения лучей, чтобы также определить видимость теней , отражения, глобальное освещение и т. д. Можно использовать трассировку лучей для всего или использовать различные методы растеризации для видимости камеры и трассировки лучей для теней, отражений и GI. «Картирование фотонов» и «трассировка пути» - это методы для расчета определенных видов распространения света (используя трассировку лучей, поэтому просто неправильно говорить, что они каким-то образом принципиально отличаются от метода рендеринга). Существуют также методы глобального освещения, которые не используют трассировку лучей, такие как «излучение» методы (который является методом конечных элементов для решения глобального распространения света, но в большинстве областей в последнее время потерял популярность). Но использование радио- или фотонного картирования для распространения света STILL требует, чтобы вы каким-то образом сделали окончательное изображение, обычно с помощью одной из стандартных техник (приведение лучей, z-буфер / растеризация и т. Д.).

Люди, которые упоминают конкретные представления формы (NURBS). , тома, треугольники) тоже немного запутаны. Это ортогональная проблема для трассировки лучей против растеризации. Например, вы можете непосредственно проследить трассировку nurbs, или вы можете разрезать nurbs в треугольники и проследить их. Вы можете напрямую растеризовать треугольники в z-буфер, но вы также можете напрямую растеризовать параметрические поверхности высокого порядка в порядке сканирования (см. Lane / Carpenter / etc CACM 1980).

но в большинстве районов поля в последнее время не пользуются популярностью). Но использование радио- или фотонного картирования для распространения света STILL требует, чтобы вы каким-то образом сделали окончательное изображение, обычно с помощью одной из стандартных техник (приведение лучей, z-буфер / растеризация и т. Д.).

Люди, которые упоминают конкретные представления формы (NURBS). , тома, треугольники) тоже немного запутаны. Это ортогональная проблема для трассировки лучей против растеризации. Например, вы можете непосредственно проследить трассировку nurbs, или вы можете разрезать nurbs в треугольники и проследить их. Вы можете напрямую растеризовать треугольники в z-буфер, но вы также можете напрямую растеризовать параметрические поверхности высокого порядка в порядке сканирования (см. Lane / Carpenter / etc CACM 1980).

но в большинстве районов поля в последнее время не пользуются популярностью). Но использование радио- или фотонного картирования для распространения света STILL требует, чтобы вы каким-то образом сделали окончательное изображение, обычно с помощью одной из стандартных техник (приведение лучей, z-буфер / растеризация и т. Д.).

Люди, которые упоминают конкретные представления формы (NURBS). , тома, треугольники) тоже немного запутаны. Это ортогональная проблема для трассировки лучей против растеризации. Например, вы можете непосредственно проследить трассировку nurbs, или вы можете разрезать nurbs в треугольники и проследить их. Вы можете напрямую растеризовать треугольники в z-буфер, но вы также можете напрямую растеризовать параметрические поверхности высокого порядка в порядке сканирования (см. Lane / Carpenter / etc CACM 1980).

как правило, с помощью одного из стандартных методов (приведение лучей, z-буфер / растеризация и т. д.). Люди, которые упоминают конкретные представления формы (NURBS, объемы, треугольники), также немного запутаны. Это ортогональная проблема для трассировки лучей против растеризации. Например, вы можете непосредственно проследить трассировку nurbs, или вы можете разрезать nurbs в треугольники и проследить их. Вы можете напрямую растеризовать треугольники в z-буфер, но вы также можете напрямую растеризовать параметрические поверхности высокого порядка в порядке сканирования (см. Lane / Carpenter / etc CACM 1980).

как правило, с помощью одного из стандартных методов (приведение лучей, z-буфер / растеризация и т. д.). Люди, которые упоминают конкретные представления формы (NURBS, объемы, треугольники), также немного запутаны. Это ортогональная проблема для трассировки лучей против растеризации. Например, вы можете непосредственно проследить трассировку nurbs, или вы можете разрезать nurbs в треугольники и проследить их. Вы можете напрямую растеризовать треугольники в z-буфер, но вы также можете напрямую растеризовать параметрические поверхности высокого порядка в порядке сканирования (см. Lane / Carpenter / etc CACM 1980).

или вы можете нарезать кубики на треугольники и отслеживать их. Вы можете напрямую растеризовать треугольники в z-буфер, но вы также можете напрямую растеризовать параметрические поверхности высокого порядка в порядке сканирования (см. Lane / Carpenter / etc CACM 1980).

или вы можете нарезать кубики на треугольники и отслеживать их. Вы можете напрямую растеризовать треугольники в z-буфер, но вы также можете напрямую растеризовать параметрические поверхности высокого порядка в порядке сканирования (см. Lane / Carpenter / etc CACM 1980).

--121 --- 2430351--

Для SQL Server я в основном использую:

- 121 --- 599636--

В дополнение к паукам и запросам, которые должны быть идемпотентными, существует также проблема безопасности с запросами get. Кто-то может легко отправить вашим пользователям электронное письмо с

<img src="http://yoursite/Delete/Me" />

в тексте, и браузер с радостью попытается получить доступ к ресурсу. Использование POST не является лекарством от таких вещей (поскольку вы можете довольно легко собрать сообщение в javascript), но это хорошее начало.

--121 --- 1858207--

Использование библиотеки Ruby Set :

require 'set'

ary = [1,1,1,2,4,6,3,3]
dups = Set.new
test_set = Set.new
ary.each {|val| dups.add(val) unless test_set.add?(val)}
dups.to_a # [1, 3]

Я считаю, что это должно быть O (n), потому что Set # add и Set # add? насколько я знаю, это операции с постоянным временем.

6
ответ дан 8 December 2019 в 05:23
поделиться

Я думал о том, сколько раз уникальный элемент появляется в массиве. Это может быть действительно неэффективно, как и первоначальное предложение, но было весело смотреть на проблему. Я не проводил никаких тестов на больших массивах, так что это просто упражнение.

a = [1,1,1,2,4,6,3,3]

dupes = []
a.uniq.each do |u|
  c = a.find_all {|e| e == u}.size
  dupes << [u, c] unless c == 1
end

puts dupes.inspect

# dupes = [[1, 3], [3, 2]]
# 1 appears 3 times
# 3 appears twice


# to extract just the elment a bit cleaner
dupes = a.uniq.select do |u|
  a.find_all {|e| e == u}.size != 1
end
puts dupes.inspect
# returns [1,3]
0
ответ дан 8 December 2019 в 05:23
поделиться

Это будет работать, если повторяющиеся записи всегда идут подряд, как в вашем примере; в противном случае вам придется сначала отсортировать. each_cons проверяет скользящее окно указанного размера.

require 'set'

my_array = [1,1,1,2,4,6,3,3]
dups = Set.new
my_array.each_cons(2) {|a,b| dups.add(a) if (a == b)}
p dups.to_a
0
ответ дан 8 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: