Zum Hauptinhalt
e-Disciplinas
  • Disciplinas »
    2026 2025 2024 2023 2022 2021 2020 2019 2018 2017 2016 2015 2014 2013 2012 AACCs/FFLCH Pró-Reitoria de Pós-Graduação Outros
  • Suporte »
    Acesso Perfis Ouvintes Docentes Criação de Disciplinas da USP Documentação HelpDesk e Contato Guia de uso Sobre
  • Deutsch ‎(de)‎
    Deutsch ‎(de)‎ English ‎(en)‎ Español - Internacional ‎(es)‎ Français ‎(fr)‎ Italiano ‎(it)‎ Português - Brasil ‎(pt_br)‎
  • Schließen
    Sucheingabe umschalten
  • Acessar

CCM0128 - Computação II (2025i)

  1. Startseite
  2. Kurse
  3. 2025
  4. RUSP
  5. CCM
  6. 0128.2025i
  7. Exercícios-programa
  8. E04 Inversões

E04 Inversões

Abschlussbedingungen
Fällig: Sonntag, 11. Mai 2025, 23:59

Seja \(a\) um vetor de inteiros e $N=a.\textit{length}$. O par de índices $(i,j)$ com $0\leq i<j<N$ é uma inversão em $a$ se $a[i]>a[j]$. Se $(i,j)$ é uma tal inversão, dizemos que $j$ é uma inversão à direita de $i$ e que $i$ é uma inversão à esquerda de $j$.

O programa InvsDetailedBrute.java.  Considere o vetor $a=\{8, 7, 8, 2, 5, 3, 7, 7\}$. Note que $N = 8$. Podemos usar o programa InvsDetailedBrute.java dado abaixo para verificar o número de inversões à esquerda e à direita para cada $0\leq i<N$:

$ echo 8 7 8 2 5 3 7 7 | java-introcs InvsDetailedBrute +
8 7 8 2 5 3 7 7
0 1 0 3 3 4 2 2
6 3 5 0 1 0 0 0
6 4 5 3 4 4 2 2
Total: 15
Elapsed time: 0.0
$

Note que $a[i]=7$ quando $i=1$. Na saída acima, vemos que $i=1$ tem uma inversão à esquerda ($8>7$) e três inversões à direita ($7>2$, $7>5$ e $7>3$), dando um total de quatro inversões em que $i=1$ participa. Outro exemplo: $i=2$ tem $0$ inversões à esquerda e $5$ inversões à direita. Há um total de $15$ inversões em $a$.

Complexidade de tempo e o programa Inversions.java.  É imediato que o programa InvsDetailedBrute.java tem tempo de execução $\Theta(N^2)$. O programa Inversions.java (também dado abaixo) determina o número total de inversões em uma sequência dada.

$ echo 8 7 8 2 5 3 7 7 | java-introcs Inversions
15
15
$

(Veja o código de Inversions.java para entender por que a saída "aparece repetida".)

O que é interessante é que Inversions.java (mais precisamente, as funções count() em Inversions.java) tem tempo de execução $O(N\log N)$. A diferença entre os tempos de execução de InvsDetailedBrute.java e Inversions.java para entradas grandes é evidente no exemplo abaixo (Generate.java é também dado abaixo):

$ java-introcs Generate 100000 1000000 314 > 100000.txt
$ java-introcs InvsDetailedBrute < 100000.txt
Total: 2499871189
Elapsed time: 14.669
$ time java-introcs Inversions < 100000.txt
2499871189
2499871189

real 0m0.647s
user 0m0.688s
sys 0m0.152s
$

Sua tarefa.  Neste exercício, você deve escrever um programa chamado InvsDetailed.java que produz exatamente a mesma saída que InvsDetailedBrute.java, mas que tem tempo de execução $O(N\log N)$. O main() de seu programa InvsDetailed.java deve ser idêntico ao main() de InvsDetailedBrute.java. O que você deve fazer é reescrever o resto de InvsDetailedBrute.java. (Sugestão óbvia: estude Inversions.java!)

Verificação.  Para verificar a correção de seu programa InvsDetailed.java, você pode comparar sua saída com a saída de InvsDetailedBrute.java:

$ echo 8 7 8 2 5 3 7 7 1 2 8 | java-introcs InvsDetailedBrute +
8 7 8 2 5 3 7 7 1 2 8
0 1 0 3 3 4 2 2 8 7 0
8 5 7 1 3 2 2 2 0 0 0
8 6 7 4 6 6 4 4 8 7 0
Total: 30
Elapsed time: 0.0
$ echo 8 7 8 2 5 3 7 7 1 2 8 | java-introcs InvsDetailed +
8 7 8 2 5 3 7 7 1 2 8
0 1 0 3 3 4 2 2 8 7 0
8 5 7 1 3 2 2 2 0 0 0
8 6 7 4 6 6 4 4 8 7 0
Total: 30
Elapsed time: 0.0
$

Você pode usar Generate.java para gerar entradas maiores facilmente. No caso de entradas grandes, a saída é também grande. Para comparar tais saídas grandes de forma simples, você pode usar o programa md5 (md5sum no GNU/Linux).

$ java-introcs Generate 100000 1000000 88888888 | java-introcs InvsDetailedBrute + | md5
Elapsed time: 14.371
a0e3dafb9966c4dcf137f2c8a6c98691
$ java-introcs Generate 100000 1000000 88888888 | java-introcs InvsDetailed + | md5
Elapsed time: 0.024
a0e3dafb9966c4dcf137f2c8a6c98691
$

Leia sobre md5 na Wikipedia (muito brevemente: se dois strings são diferentes, "muito provavelmente" seus md5 são diferentes; dito de outra forma, se dois strings têm o mesmo md5, então "provavelmente" eles são o mesmo string).

Entrega.  Neste exercício, basta entregar seu programa InvsDetailed.java.

  • E04 E04
    23. April 2025, 19:42
  • E04.tar.gz E04.tar.gz
    23. April 2025, 19:42
◄ E03 Bouncing balls OO
E05 Parafusos e porcas ►

Blöcke

Navigation überspringen
  • Startseite

    • e-Disciplinas

      • Meine Kurse

      • Tags

      • Suchen

      • TextseiteSobre

      • TextseiteHelp Desk e Contato

      • TextseiteGuia

    • Meine Kurse

    • Kurse

      • 2025

        • CENA

        • EACH

        • ECA

        • EE

        • EEFE

        • EEFERP

        • EEL

        • EERP

        • EESC

        • EP

        • ESALQ

        • FAU

        • FCF

        • FCFRP

        • FD

        • FDRP

        • FE

        • FEA

        • FEARP

        • FFCLRP

        • FFLCH

        • FM

        • FMBRU

        • FMRP

        • FMVZ

        • FO

        • FOB

        • FORP

        • FSP

        • FZEA

        • IAG

        • IAU

        • IB

        • ICB

        • ICMC

        • IEB

        • IEE

        • IF

        • IFQSC

        • IFSC

        • IGc

        • IME

        • IO

        • IP

        • IPEN

        • IQ

        • IQSC

        • IRI

        • HRAC

        • MAC

        • MAE

        • MP

        • MZ

        • RUSP

          • PRG

          • CCM

            • CCM0118-235-2025

            • CCM0214-2025

            • CCM0113-235-2025

            • CCM0212-234-2025

            • CCM0211-2025

            • CCM0213-2025

            • CCM0218-234-2025*

            • CCM0218-234-2025

            • CCM0114-235-2025

            • Biologia 1 - 2025

            • CCM0215-134-2025

            • CCM0121-2025

            • CCM0221-2025

            • 0128.2025i

              • Allgemeines

              • Exercícios propostos em sala

              • Exercícios-programa

                • AufgabeE04 Inversões

            • CCM0122-134-2025

            • CCM0223-133-2025

            • CCM0222-133-2025

            • CCM0224-133-2025

            • CCM0124-134-2025

          • IAL

          • DPG

          • PDPD

          • PDPD

          • PDPD

          • PDPD

          • PDPD2025

          • PDPD2025

          • Ciclo PDPD2025

      • 2026

      • 2024

      • 2023

      • 2022

      • 2021

      • 2020

      • 2019

      • 2018

      • 2017

      • 2016

      • 2015

      • 2014

      • 2013

      • 2012

      • Grupos de Estudos, Pesquisa e Outros

      • PRPG - Pró-Reitoria de Pós-Graduação

      • STI

Ergänzungsblöcke

Sie sind als Gast angemeldet (Anmelden)
Powered by Moodle