Эффективно получите отсортированные суммы отсортированного списка

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

AWS реализовал два уровня защиты от стеганого оружия, предназначенных для того, чтобы сделать эти ошибки более сложными - существуют настройки уровня корзины и уровня счета, чтобы предотвратить публичный доступ к корзинам, и ] из которых нужно «разрешить» вам это сделать. Если какая-либо из политик не позволяет вам публиковать корзину, вы получите Access Denied при попытке создать или изменить политику корзины, если система классифицирует вашу новую политику как даже слегка «общедоступную».

Прежде чем продолжить и отключить безопасность, обратите внимание, что система пытается защитить вас от себя. По сути, никогда нет веской причины, чтобы * писать или удалять из вашего списка. "Principal": "*" означает любого пользователя, включая неаутентифицированных / анонимных пользователей.

Найдите «Настройки общего доступа для этой учетной записи» на левой панели навигации консоли S3 для глобальных настроек.

https://aws.amazon.com/blogs/aws/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/ [113 ] [+1112]

18
задан Peter Burns 3 August 2008 в 21:38
поделиться

8 ответов

Редактирование по состоянию на 2018: необходимо, вероятно, прекратить читать это. (Но я не могу удалить его, поскольку это принято.)

, Если Вы выписываете суммы как это:

1 4  5  6  8  9
---------------
2 5  6  7  9 10
  8  9 10 12 13
    10 11 13 14
       12 14 15
          16 17
             18

Вы заметите что с тех пор M [я, j] < = M [я, j+1] и M [я, j] < = M [i+1, j], затем только необходимо исследовать верхние левые "углы" и выбрать самый низкий.

, например,

  • только 1 верхний левый угол, выберите 2
  • только 1, выберите 5
  • 6 или 8, выберите 6
  • 7 или 8, выберите 7
  • 9 или 8, выберите 8
  • 9 или 9, выберите обоих :)
  • 10 или 10 или 10, выберите весь
  • 12 или 11, выберите 11
  • 12 или 12, выберите оба
  • 13 или 13, выберите оба
  • 14 или 14, выберите оба
  • 15 или 16, выберите 15
  • только 1, выберите 16
  • только 1, выберите 17
  • только 1, выберите 18

, Конечно, когда Вы имеете партии из верхних левых углов затем, это решение передает.

я вполне уверен, этой проблемой является О© (nВІ), потому что необходимо вычислить суммы для каждого M [я, j] - если у кого-то нет лучшего алгоритма для суммирования :)

12
ответ дан 30 November 2019 в 09:07
поделиться

Можно ли сделать это в двух строках в Python с

allSums = set(a+b for a in X for b in X)
allSums = sorted(allSums)

, стоимость этого является n^2 (возможно, дополнительный фактор журнала для набора?) для повторения и s * журнал (журналы) для сортировки, где s является размером набора.

размер набора мог быть целым n* (n-1)/2, например, если X = [1,2,4..., 2^n]. Таким образом, если Вы захотите генерировать этот список, то он возьмет, по крайней мере, n^2/2 в худшем случае, так как это - размер вывода.

Однако, если Вы хотите выбрать первые k элементы результата, можно сделать это в O (kn) использование алгоритма выбора для отсортированных матриц X+Y Frederickson, и Johnson ( посмотрите здесь для окровавленных деталей) . Хотя это может, вероятно, быть изменено, чтобы генерировать их онлайн путем многократного использования вычисления и получить эффективный генератор для этого набора.

@deuseldorf, Peter There является некоторым беспорядком о (n!) Я серьезно сомневаюсь относительно deuseldorf, предназначенного "n факториал", но просто "n, (очень взволнованный)!"

2
ответ дан 30 November 2019 в 09:07
поделиться

Вместо того, чтобы кодировать это, я полагаю, что псевдокодирую его на шагах и объясню мою логику, так, чтобы лучшие программисты могли ввести дыры по абсолютному адресу в моей логике при необходимости.

На первом шаге мы начинаем со списком длины чисел n. Для каждого числа мы должны создать список длины n-1 becuase, мы не добавляем число к себе. К концу у нас есть список приблизительно n отсортированные списки, который был сгенерирован в O (n^2) время.

step 1 (startinglist) 
for each number num1 in startinglist
   for each number num2 in startinglist
      add num1 plus num2 into templist
   add templist to sumlist
return sumlist 

На шаге 2, потому что списки были отсортированы по дизайну (добавляют, число к каждому элементу в отсортированном списке и списке будет все еще отсортировано), мы можем просто сделать сортировку с объединением путем слияния каждого списка вместе вместо того, чтобы сортировать всех с объединением. В конце это должно взять O (n^2) время.

step 2 (sumlist) 
create an empty list mergedlist
for each list templist in sumlist
   set mergelist equal to: merge(mergedlist,templist)
return mergedlist

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

, Таким образом, существует мое решение. Весь алгоритм является O (n^2) время. Не стесняйтесь указывать на любые ошибки или улучшения.

4
ответ дан 30 November 2019 в 09:07
поделиться

В SQL:

create table numbers(n int not null)
insert into numbers(n) values(1),(1), (2), (2), (3), (4)


select distinct num1.n+num2.n sum2n
from numbers num1
inner join numbers num2 
    on num1.n<>num2.n
order by sum2n

C# LINQ:

List<int> num = new List<int>{ 1, 1, 2, 2, 3, 4};
var uNum = num.Distinct().ToList();
var sums=(from num1 in uNum
        from num2 in uNum 
        where num1!=num2
        select num1+num2).Distinct();
foreach (var s in sums)
{
    Console.WriteLine(s);
}
1
ответ дан 30 November 2019 в 09:07
поделиться

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

Мой алгоритм, в Haskell:

matrixOfSums list = [[a+b | b <- list, b >= a] | a <- list]

sortedSums = foldl merge [] matrixOfSums

--A normal merge, save that we remove duplicates
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = case compare x y of
    LT -> x:(merge xs (y:ys))
    EQ -> x:(merge xs (dropWhile (==x) ys))
    GT -> y:(merge (x:xs) ys)

я нашел незначительное улучшение, один это более поддается ленивому кодированию на основе потоков. Вместо того, чтобы объединить столбцы попарно, объедините всех их сразу. Так как преимущество - это, Вы начинаете получать элементы списка сразу.

-- wide-merge does a standard merge (ala merge-sort) across an arbitrary number of lists
-- wideNubMerge does this while eliminating duplicates
wideNubMerge :: Ord a => [[a]] -> [a]
wideNubMerge ls = wideNubMerge1 $ filter (/= []) ls
wideNubMerge1 [] = []
wideNubMerge1 ls = mini:(wideNubMerge rest)
    where mini = minimum $ map head ls
          rest = map (dropWhile (== mini)) ls

betterSortedSums = wideNubMerge matrixOfSums

Однако, если Вы знаете, что собираетесь использовать все суммы, и нет никакого преимущества для получения некоторых из них ранее, пойдите с' foldl merge []', поскольку это быстрее.

1
ответ дан 30 November 2019 в 09:07
поделиться

Независимо от того, что Вы делаете без дополнительных ограничений на входные значения, Вы не можете добиться большего успеха, чем O (n^2), просто потому что необходимо выполнить итерации через всех пар чисел. Повторение будет доминировать над сортировкой (который можно сделать в O (n, регистрируют n) или быстрее).

1
ответ дан 30 November 2019 в 09:07
поделиться

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

Так или иначе, Вы не можете убежать от n^2 природы его легко, но можно сделать немного лучше со слиянием, так как Вы можете, обязал диапазон вставлять каждый элемент в.

при рассмотрении всех списков, Вы генерируете, у них есть следующая форма:

(a[i], a[j]) | j>=i

при зеркальном отражении этого 90 градусами Вы добираетесь:

(a[i], a[j]) | i<=j

Теперь, процесс слияния должен брать два списка i и i+1 (которые соответствуют спискам, где первый участник всегда a[i] и a[i+1]), Вы можете, обязал диапазон вставлять элемент (a[i + 1], a[j]) в список i местоположением (a[i], a[j]) и местоположением (a[i + 1], a[j + 1]).

Это означает, что необходимо объединиться наоборот с точки зрения [1 110]. Я (еще) не знаю, можно ли усилить это через [1 111] также, но это кажется возможным.

1
ответ дан 30 November 2019 в 09:07
поделиться

Если Вы будете искать действительно решение агностика языка затем, то Вы будете очень разочарованы, по-моему, потому что Вы застрянете с для цикла и некоторых условных выражений. Однако, если Вы открыли его до функциональных языков или функциональных функций языка (я смотрю на Вас LINQ), затем, мои коллеги здесь могут заполнить эту страницу изящными примерами в Ruby, Lisp, Erlang и других.

-4
ответ дан 30 November 2019 в 09:07
поделиться
Другие вопросы по тегам:

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