Løsningsforslag - oppgaver i Avsnitt 1.4.11


Oppgave 1

Anta at relasjonen R på mengden A er refleksiv og transitiv og la S være realsjonen på A gitt ved S = R R −1.

Oppgave 2

Ekvivalensklassen til "ABCD" vil inneholde 24 = 16 tegnstrenger og den til "algoritme" vil inneholde 29 = 512 tegnstrenger.

Oppgave 3

import java.util.*;

public class StrenglengdeKomparator implements Comparator<String>
{
  public int compare(String s1, String s2)
  {
    return s1.length() - s2.length(); // differansen i strenglengde
  }
} // class StrenglengdeKomparator

Oppgave 4

Hvis en bitsekvens i form av et int-tall starter med en 0-bit, er tallet ikke-negativt. Det å sammenligne slike bitsekvenser leksikografisk er det samme som å sammenligen dem med hensyn på vanlig tallstørrelse. En bitsekvens i form av et int-tall som starter med en 1-bit, representerer på grunn av 2-er komplement, et negativt tall. Hvis det ene tallet er ikke-negativt og det andre negativt, vil det ikke-negative tallet komme foran det negative leksikografisk. Hvis begge er negative, er en leksikografisk sammenligning det samme som å sammenligen med hensyn på tallstørrelse.

public class BitSekvens implements Comparable<BitSekvens>
{
  private int sekvens;

  public BitSekvens() { sekvens = 0; }

  public BitSekvens(int sekvens) { this.sekvens = sekvens; }

  public int compareTo(BitSekvens b)
  {
    if (sekvens >= 0 && b.sekvens >= 0) return sekvens - b.sekvens;
    if (sekvens >= 0 && b.sekvens < 0) return -1;
    if (sekvens < 0 && b.sekvens >= 0) return 1;

    return sekvens - b.sekvens;
  }

  public boolean equals(Object o)
  {
    if (o == this) return true;
    if (!(o instanceof BitSekvens)) return false;
    return compareTo((BitSekvens)o) == 0;
  }

  public String toString()
  {
    String s = Integer.toBinaryString(sekvens);
    if (sekvens < 0) return s;

    int k = 32 - s.length();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < k; i++) sb.append('0');
    sb.append(s);
    return sb.toString();
  }

  public int hashCode()
  {
    return sekvens;
  }

}

Metoden compareTo kan også kodes direkte på bitene. F.eks. slik:

  public int compareTo(BitSekvens b)
  {
    int k = Integer.highestOneBit(sekvens ^ b.sekvens);
    if (k == 0) return 0;
    return (k & sekvens) == 0 ? - 1 : 1;
  }

Oppgave 5

  Comparator<Student> c = (s1,s2) ->
  {
    int k = s1.klasse().compareToIgnoreCase(s2.klasse());
    return k != 0 ? k : s1.compareTo(s2);
  };

eller

  Comparator<Student> c =
  Comparator.comparing((Student s) -> s.klasse().toUpperCase()).
  thenComparing(Comparator.naturalOrder());