Прибл. расположение пустой области в изображении [дубликат]

Используйте функцию callback() внутри успеха foo(). Попробуйте таким образом. Это просто и легко понять. & nbsp;

var lat = "";
var lon = "";
function callback(data) {
    lat = data.lat;
    lon = data.lon;
}
function getLoc() {
    var url = "http://ip-api.com/json"
    $.getJSON(url, function(data) {
        callback(data);
    });
}

getLoc();
65
задан DevNull 15 December 2014 в 22:41
поделиться

7 ответов

34
ответ дан Community 26 August 2018 в 04:41
поделиться

Вот решение, основанное на проблеме «Самый большой прямоугольник в гистограмме» , предложенной @j_random_hacker в комментариях:

[Алгоритм] работает путем итерации по строкам сверху вниз, для каждой строки, решающей эту проблему , где «бары» в «гистограмме» состоят из всех непрерывных восходящих траекторий нулей, которые начинаются с текущей строки (столбец имеет высоту 0, если он имеет 1 в текущей строке).

Входная матрица mat может быть произвольной итерируемой, например, файлом или сетевым потоком. Одновременно требуется только одна строка.

#!/usr/bin/env python
from collections import namedtuple
from operator import mul

Info = namedtuple('Info', 'start height')

def max_size(mat, value=0):
    """Find height, width of the largest rectangle containing all `value`'s."""
    it = iter(mat)
    hist = [(el==value) for el in next(it, [])]
    max_size = max_rectangle_size(hist)
    for row in it:
        hist = [(1+h) if el == value else 0 for h, el in zip(hist, row)]
        max_size = max(max_size, max_rectangle_size(hist), key=area)
    return max_size

def max_rectangle_size(histogram):
    """Find height, width of the largest rectangle that fits entirely under
    the histogram.
    """
    stack = []
    top = lambda: stack[-1]
    max_size = (0, 0) # height, width of the largest rectangle
    pos = 0 # current position in the histogram
    for pos, height in enumerate(histogram):
        start = pos # position where rectangle starts
        while True:
            if not stack or height > top().height:
                stack.append(Info(start, height)) # push
            elif stack and height < top().height:
                max_size = max(max_size, (top().height, (pos - top().start)),
                               key=area)
                start, _ = stack.pop()
                continue
            break # height == top().height goes here

    pos += 1
    for start, height in stack:
        max_size = max(max_size, (height, (pos - start)), key=area)    
    return max_size

def area(size):
    return reduce(mul, size)

Решение - O(N), где N - количество элементов в матрице. Это требует O(ncols) дополнительной памяти, где ncols - количество столбцов в матрице.

Последняя версия с тестами находится в https://gist.github.com/776423

36
ответ дан Community 14 October 2018 в 18:47
поделиться
  • 1
    – j_random_hacker 14 January 2011 в 03:02
  • 2
    Основная проблема заключается в том, что не всегда достаточно отслеживать только (несколько) прямоугольников наибольшей площади соседних точек, как вы здесь делаете. Единственный алгоритм O (N), который, как я знаю, работает корректно, выполняет итерацию по строкам сверху вниз, для каждой строки, решающей эту проблему: stackoverflow.com/questions/4311694/… , где & Quot; бары & Quot; в "гистограмме" состоят из всех непрерывных восходящих траекторий нулей, которые начинаются с текущей строки (столбец имеет высоту 0, если он имеет 1 в текущей строке). – j_random_hacker 14 January 2011 в 03:08
  • 3
    @j_random_hacker: Я обновил свой ответ, чтобы использовать алгоритм с «гистограммой». – jfs 14 January 2011 в 13:45
  • 4
    Выглядит хорошо, +2! :) – j_random_hacker 15 January 2011 в 05:14
  • 5
    Это выглядит великолепно, однако, я пытаюсь на самом деле найти самый большой прямоугольник (как в, вернуть координаты). Этот алгоритм будет надежно возвращать область, но как только я это узнаю, как бы человек обнаружил, что расположение прямоугольника с тремя столбцами x 2 с его верхним левым углом в [3, 5] (например)? – JBWhitmore 26 January 2014 в 05:25
3
ответ дан Astha Gupta 26 August 2018 в 04:41
поделиться
3
ответ дан dmarra 26 August 2018 в 04:41
поделиться
2
ответ дан Pierre Fourgeaud 26 August 2018 в 04:41
поделиться
7
ответ дан tommy.carstensen 26 August 2018 в 04:41
поделиться
0
ответ дан MiB_Coder 14 October 2018 в 18:47
поделиться
Другие вопросы по тегам:

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