AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78968406
Accepted
Peter Wu
Peter Wu
Asked: 2024-09-10 15:43:01 +0800 CST2024-09-10 15:43:01 +0800 CST 2024-09-10 15:43:01 +0800 CST

Algoritmo para minimizar (s[i]-s[j]+d)/(ij)

  • 772

O problema é baseado em um problema de concurso leetcode ( https://doocs.github.io/leetcode/en/lc/3281/ ). Pode-se reduzi-lo ao seguinte problema: seja s um array ordenado e d um inteiro positivo, minimize ( s [i]- s [j]+ d )/(ij). Em que i>j.

A maioria das respostas foi baseada em busca binária para limitar uma solução ótima, para a qual a complexidade de tempo é dependente de max( s )-min( s ). Então é possível construir um algoritmo que seja linear/subquadrático em relação ao tamanho de s ?

algorithm
  • 1 1 respostas
  • 75 Views

1 respostas

  • Voted
  1. Best Answer
    Matt Timmermans
    2024-09-10T20:49:17+08:002024-09-10T20:49:17+08:00

    Você pode fazer isso em tempo O(n log n).

    Primeiro, observe que se representássemos graficamente os pontos baixos s[i]junto com os pontos altos s[i]+d, nossa tarefa seria encontrar a linha com a menor inclinação possível de um ponto baixo para um ponto alto à sua direita.

    À medida que iteramos pelos pontos altos, podemos determinar qual dos pontos baixos à esquerda se conecta com a menor inclinação e, então, lembrar qual é o melhor.

    Podemos encontrar o melhor ponto de conexão em tempo O(log n), porque é garantido que ele esteja no casco convexo superior dos pontos baixos à esquerda. Conforme iteramos pelos pontos altos, podemos usar o algoritmo de cadeia monótona para construir simultaneamente o casco convexo superior dos pontos baixos à sua esquerda. Isso leva tempo constante amortizado por ponto.

    Dado o casco convexo superior de pontos à esquerda, podemos usar uma busca binária para encontrar o melhor ponto de conexão, porque a inclinação dos segmentos do casco convexo diminui monotonicamente. Para todos os segmentos à esquerda do melhor ponto de conexão, o ponto alto atual estará abaixo ou em sua linha, e para todos os segmentos à direita do melhor ponto de conexão, o ponto alto atual estará acima ou em sua linha.

    insira a descrição da imagem aqui

    Aqui está uma implementação em python:

    
    # is n1/d1 < n2/d2 ?
    def fracLessThan(n1,d1,n2,d2):
        return n1*d2 < n2*d1
    
    def minSlope(s,d):
        if len(s) < 2:
            return None
        s = sorted(s)
        # parallel arrays to keep track of the upper convex hull of previous points
        hullx = [0,1]
        hully = [s[0],s[1]]
        # keep track of the best slope as a fraction
        bestSlope = (s[1]+d-s[0], 1)
        for x in range(2, len(s)):
            y = s[x]+d
            # binary search find the best connecting slope
            l = 0
            h = len(hullx)-1
            while(l<h):
                mid = l + (h-l)//2
                # is (x,y) below the segment after mid?
                if fracLessThan(y-hully[mid], x-hullx[mid], hully[mid+1]-hully[mid], hullx[mid+1]-hullx[mid]):
                    # yes.  mid is too low
                    l = mid+1
                else:
                    # no. mid is high enough
                    h = mid
            # best connecting point slope
            num = y - hully[l]
            den = x - hullx[l]
            if fracLessThan(num, den, bestSlope[0], bestSlope[1]):
                bestSlope = (num, den)
            
            # update the convex hull
            y = s[x]
            while len(hullx) > 1:
                lastn = hully[-1] - hully[-2]
                lastd = hullx[-1] - hullx[-2]
                testn = y - hully[-2]
                testd = x - hullx[-2]
                if (fracLessThan(testn, testd, lastn, lastd)):
                    break
                hullx.pop()
                hully.pop()
            hullx.append(x)
            hully.append(y)
    
        return bestSlope
    
    ans = minSlope([0,5,6,9,10,12],4)
    # prints 11/4
    print("min slope is {0}/{1}".format(ans[0], ans[1]))
    
    • 2

relate perguntas

  • Encontre o menor número inteiro positivo, que não divide nenhuma diferença mútua de inteiros em uma matriz

  • O último dígito de um grande número de casos de teste falha em Golang Codewars

  • Escreva um programa LMC que calcule a soma dos números inseridos pelo usuário. Exibir soma antes de parar

  • Como determinar os estados alcançáveis ​​no problema de 3 jarras de água?

  • Encontre o número de pares de números naturais de l a r que bit a bit AND é igual a 0

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve