OK, isso pode parecer uma pergunta de lição de casa e, em certo sentido, é. Como tarefa de lição de casa em uma aula de algoritmos de graduação, dei o seguinte clássico:
Dado um gráfico não direcionado , forneça um algoritmo que encontre um corte tal que , onde é o número de arestas que cruzam o corte. A complexidade do tempo deve ser .
Por alguma razão, obtive muitas das seguintes soluções. Agora, ele usa muito tempo, por isso não é uma questão de classificação, mas fiquei curioso. Não parece "correto", mas todas as minhas tentativas de contra-exemplos falharam. Aqui está:
- Definir
- Seja um vértice de grau máximo no gráfico
- Adicionar a
- Exclua todas as arestas adjacentes a
- Se retornar para 2
Observe que na etapa 5 se refere ao gráfico original. Observe também que, se pulássemos a etapa 4, isso obviamente estaria errado (por exemplo, a união de um triângulo com duas arestas isoladas).
Agora, qualquer prova simples tem o seguinte problema - pode ser que quando adicionamos um novo vértice na verdade removemos arestas do corte ao adicionar novas arestas (em que se refere ao gráfico com as arestas excluídas). O fato é que, se isso é prejudicial à nossa causa, significa que esse vértice "costumava" ter um grau cada vez mais alto, portanto "deveria ter sido" selecionado anteriormente.
Isso é um algoritmo bem conhecido? Existe algum contra-exemplo simples para isso?
Respostas:
Minha reivindicação anterior de não ter tido em conta o corte de tamanhon2/4já presente no gráfico. A seguinte construção parece resultar (empericamente - eu criei uma pergunta em math.stackexchange.com para obter uma prova rigorosa) em umO(12c+6 n2/4 fração.O(1logc)
O algoritmo tem um desempenho ruim em uniões de vários gráficos completos desconectados e de tamanhos diferentes. Denotamos o gráfico completo em vértices como K n . Considere o comportamento do algoritmo em K n : ele adiciona repetidamente um vértice arbitrário ainda não em S para S - todos esses vértices são idênticos e, portanto, a ordem não importa. Configurando o número de vértices ainda não adicionados a S pelo algoritmo | ˉ S | = k , o tamanho do corte naquele momento é k ( n - k ) .n Kn Kn S S S |S¯|=k k(n−k)
Considere o que acontece se executar o algoritmo em várias desligado gráficos com x i constantes entre 0 e 1. Se k i é o número de elementos ainda não em S no i th grafo completo, em seguida, o algoritmo irá repetidamente adicionar um vértice de S a partir do gráfico completo com maior k i , quebrando laços arbitrariamente. Isso induzirá adições de vértices baseadas em `` arredondadas '' a S : o algoritmo adiciona um vértice de todos os gráficos completos com o maior k = k i , depois de todos os gráficos completos com kKxin xi ki S i S ki S k=ki (com k i atualizado após a rodada anterior) e assim por diante. Quando um gráfico completo tiver um vértice adicionado a S em uma rodada, ele fará isso para cada rodada a partir de então.ki=k−1 ki S
Seja o número de gráficos completos. Seja 0 < x i ≤ 1 com 0 ≤ i ≤ c - 1 o modificador de tamanho do i- ésimo gráfico completo. Solicitamos esses modificadores de tamanho de grande a pequeno e definimos x 0 = 1 . Agora, temos que, se houver c ′ gráficos com exatamente k elementos ainda não adicionados a S , então o tamanho do corte nesse momento será ∑ c ′ - 1 i = 0 k (c 0<xi≤1 0≤i≤c−1 i x0=1 c′ k S . O número total de arestas é | E | = ∑ c - 1 i = 0 x i n ( x i n - 1 )∑c′−1i=0k(xin−k)=kn∑c′−1i=0(xi)−c′k2 .|E|=∑c−1i=0xin(xin−1)2≈n22∑c−1i=0x2i
Observe que é uma função quadrática em k e, portanto, tem um máximo. Portanto, teremos vários cortes locais máximos. Por exemplo, se c = 1, nosso corte máximo é em k = nkn∑c′−1i=0xi−c′k2 k c=1 de tamanhon2k=n2 . Vamos escolherx1de modo queX1=1/2-ε, o que significa que o segundo gráfico completo não alterará o tamanho de este corte localmente mimo emk=nn24 x1 x1=1/2−ε k=n2 k=3/8n−ε′ ε , ε ' , ε " ε x 1 = 1 / 2 x 1 n = nx2=3/8n−ε′′ ε,ε′,ε′′ ε x1=1/2 nx1n=n2−1 n
Desejamos encontrar os máximos locais de nossos cortes. Diferenciamos para , produzindo . Igualar a dá , que fornece um corte de tamanho . k n ∑ c ′ - 1 i = 0 ( x i ) - 2 c ′ k 0 k = nkn∑c′−1i=0(xi)−c′k2 k n∑c′−1i=0(xi)−2c′k 0 n2k=n2c′∑c′−1i=0xi n24c′(∑c′−1i=0xi)2
Seja o determinado no parágrafo anterior se . Garantiremos que a fórmula seja exigindo que - todos os gráficos completos com sejam menores que o desse corte local máximo e, portanto, não aumentem o tamanho do corte. Isso significa que temos cortes nesses que são maiores que todos os outros cortes encontrados pelo algoritmo. k c ′ = i x i n < k i i ′ i ' > i k i c k iki k c′=i xin<ki i′ i′>i ki c ki
Preenchendo , obtemos a recorrência (mais alguns pequenos ) com . Resolver isso gera : veja minha pergunta em math.stackexchange.com para obter a derivação de @Daniel Fisher. Conectando isso a e usando nossa percepção da recorrência nos dá cortes de tamanho . Usando propriedades deste coeficiente binomial central , temosx i = 1xin<ki εx0=1xi= ( 2 ixi=12c′∑c′−1i=0xi ε x0=1 n2xi=(2ii)4i n2n24c′(∑c′−1i=0xi)2 n24c′(2c′(2c′c′)4c′)2=n2c′((2c′c′)4c′)2 limc′→∞c′((2c′c′)4c′)2=1π (veja também minha pergunta em math.stackexchange.com ).
O número de arestas é aproximadamente . Por propriedades conhecidas , temos . A apresentação fornece pelo menos que é assintoticamente conforme vai para infinidade.1n22∑c−1i=0x2i=n22∑c−1i=0((2ii)4i)2 n214i√≤(2ii)4i n2n22∑c−1i=0(14i√)2=n28∑c−1i=01i cn28logc c
Portanto, temos é assintoticamente igual a conforme vai para o infinito, mostrando que o algoritmo pode cortes de retorno que são frações arbitrariamente baixas de.8δ(S,S¯)|E| c| E|8πlogc c |E|
fonte
Depois de um tempo pensando e perguntando, aqui está um contra-exemplo, cortesia de Ami Paz :
Seja igual e seja um gráfico que é a união de com uma correspondência de vértices (isto é, uma correspondência com arestas).G K n n + 2 n / 2 + 1n G Kn n+2 n/2+1
Como o algoritmo é executado neste gráfico? Leva apenas vértices da parte da clique em ordem arbitrária. Depois de extrair vértices da clique, o corte é do tamanho . Isso é máximo para , que fornece um corte de tamanho , enquanto o número de arestas no gráfico é .k ⋅ ( n - k ) k = n / 2 n 2k k⋅(n−k) k=n/2 n2n24 n22+1
O algoritmo conforme prescrito continuará adicionando vértices da clique, reduzindo o número de arestas cruzando o corte, até que o que resta da clique seja apenas uma única aresta. Neste ponto, ele não pode obter nada melhor que .n2+2
fonte