Vinnaren i pepparkakshustävlingen!
2017-12-07, 13:21
  #7021
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av e7andy
Det blev flera O(n) och rekursionen bör väl bli större än O(n)?. Den ursprungliga lösningen vara bara O(n).

Problemet med regex:en var att göra replace på alla tecken utom de vi vill ha kvar.
Den här tar bort alla tecken utom (), {} och []:
string.replaceAll("[^(){}\\[\\]]","");
Det går inte att stoppa in /* och */ på något sätt som jag känner till eftersom varje enskilt tecken i uttrycket räknas.
En lösning skulle vara att göra två eller fler replaceAll. Först string.replaceAll("[^(){}\\[\\]*/\\\\]",""); och sen gör man en till för att få bort alla som inte är /* och */.

Jag är inte jättebra på regex så det kanske går att lösa på något smart sätt.
Om jag fattat syntaxen rätt:
^ = negation
X|Y = X eller Y
XY = X följt av Y
De aktuella symbolerna: (,),[,],{,},/*,*/
För att skilja dem från uttryckets operatorer används \. Så ( skrivs \( och /* skrivs \/\*
Så ungefär ^(\(|\)|\[|\]|\{|\}|\/\*|\*\/)
Med de olika symbolerna fetmarkerade: ^(\(|\)|\[|\]|\{|\}|\/\*|\*\/)
Citera
2017-12-07, 14:49
  #7022
Moderator
Neksnors avatar
Nä, det där \-tecknet behöver tydligen dubblas* och sedan var det lite fel med ^.**
Har testat och
Kod:
string.replaceAll("[^(\\(|\\)|\\[|\\]|\\{|\\}|\\/\\*|\\*\\/)]","");
funkar.


* Se https://docs.oracle.com/javase/7/doc...ttern.html#sum under "Backslashes, escapes, and quoting"

** Känns inte jättesmidigt att använda samma tecken, men på lite olika sätt, till två olika saker, negation och "The beginning of a line".
Citera
2017-12-08, 10:58
  #7023
Medlem
Citat:
Ursprungligen postat av Neksnor
Nä, det där \-tecknet behöver tydligen dubblas* och sedan var det lite fel med ^.**
Har testat och
Kod:
string.replaceAll("[^(\\(|\\)|\\[|\\]|\\{|\\}|\\/\\*|\\*\\/)]","");
funkar.
Tyvärr så fungerar inte det. Den sparar även lösa *, / och \. Den tittar på varje enskilt tecken när det står inom hakar.
Dessa två kodrader ger exakt samma resultat:
string.replaceAll("[^(\\(|\\)|\\[|\\]|\\{|\\}|\\/\\*|\\*\\/)]","");
string.replaceAll("[^\\(\\)\\[\\]\\{\\}\\/\\*]","");

Skicka in strängen: "abc*def/"
Om ditt uttryck skulle fungera så skulle den returnera tomma strängen men resultatet blir: */
__________________
Senast redigerad av e7andy 2017-12-08 kl. 11:08.
Citera
2017-12-09, 16:13
  #7024
Medlem
ozyrecons avatar
Tjena, jag leker lite med Binary Heap men har fastnat lite i tankeverksamheten. Jag har med hjälp av tutorials lyckats skapa och fylla denna Heapen med rätt siffror.

Arrayen är tänkt att se ut såhär när den linjära lösningen är implementerad.

Värde: 1, 3, 2,12, 6,4, 8, 15,14,9, 7, 5, 11, 13, 10

Plats: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14






Koden ser ut enligt följande och något säger mig att lösningen är enkel men jag kan inte komma på någon lösning.


Kod:
public class Main {

    public static void main(String[] args) throws IOException {
        //10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7, 4, 11, 13, 2

        BinaryHeap bh = new BinaryHeap(15);

        bh.insert(10);
        bh.insert(12);
        bh.insert(1);
        bh.insert(14);
        bh.insert(6);
        bh.insert(5);
        bh.insert(8);
        bh.insert(15);
        bh.insert(3);
        bh.insert(9);
        bh.insert(7);
        bh.insert(4);
        bh.insert(11);
        bh.insert(13);
        bh.insert(2);


        //System.out.println(bh.deleteMin());
        //System.out.println(bh.isFull());
        //System.out.println("Empty status = "+ bh.isEmpty());
        //bh.makeEmpty();
        bh.printHeap();
        System.out.println(bh.findMin());


    }
}




/** Class BinaryHeap **/
class BinaryHeap
{
    /** The number of children each node has **/
    private static final int d = 2;
    private int heapSize;
    private int[] heap ;

    // Constructor **/
    public BinaryHeap(int capacity)
    {
        heapSize = 0;
        heap = new int[capacity + 1];

        Arrays.fill(heap, -1);
    }

    // Function to check if heap is empty **/
    public boolean isEmpty( )
    {
        return heapSize == 0;
    }

    // Check if heap is full
    public boolean isFull( )
    {
        return heapSize == heap.length;
    }

    /** Clear heap */
    public void makeEmpty( )
    {
        heapSize = 0;
    }

    /** Function to  get index parent of i **/
    private int parent(int i)
    {
        return (i - 1)/d;
    }

    /** Function to get index of k th child of i **/
    private int kthChild(int i, int k)
    {
        return d * i + k;
    }

    /** Function to insert element */
    public void insert(int x)
    {
        if (isFull( ) )
            throw new NoSuchElementException("Overflow Exception");
        /** Percolate up **/
        heap[heapSize++] = x;
        heapifyDown(heapSize - 1);
    }

    /** Function to find least element **/
    public int findMin( )
    {
        if (isEmpty() )
            throw new NoSuchElementException("Underflow Exception");
        return heap[0];
    }

    /** Function to delete min element **/
    public int deleteMin()
    {
        int keyItem = heap[0];
        delete(0);
        return keyItem;
    }

    /** Function to delete element at an index **/
    public int delete(int ind)
    {
        if (isEmpty() )
            throw new NoSuchElementException("Underflow Exception");
        int keyItem = heap[ind];
        heap[ind] = heap[heapSize - 1];
        heapSize--;
        heapifyDown(ind);
        return keyItem;
    }

    /** Function heapifyUp  **/
    private void heapifyUp(int childInd)
    {
        int tmp = heap[childInd];
        while (childInd > 0 && tmp < heap[parent(childInd)])
        {
            heap[childInd] = heap[ parent(childInd) ];
            childInd = parent(childInd);
        }
        heap[childInd] = tmp;
    }

    /** Function heapifyDown **/
    private void heapifyDown(int ind)
    {
        int child;
        int tmp = heap[ ind ];
        while (kthChild(ind, 1) < heapSize)
        {
            child = minChild(ind);
            if (heap[child] < tmp)
                heap[ind] = heap[child];
            else
                break;
            ind = child;
        }
        heap[ind] = tmp;
    }

    /** Function to get smallest child **/
    private int minChild(int ind)
    {
        int bestChild = kthChild(ind, 1);
        int k = 2;
        int pos = kthChild(ind, k);
        while ((k <= d) && (pos < heapSize))
        {
            if (heap[pos] < heap[bestChild])
                bestChild = pos;
            pos = kthChild(ind, k++);
        }
        return bestChild;
    }

    /** Function to print heap **/
    public void printHeap()
    {
        System.out.print("\nHeap = ");
        for (int i = 0; i < heapSize; i++)
            System.out.print(heap[i] +" ");
        System.out.println();
    }
}
__________________
Senast redigerad av ozyrecon 2017-12-09 kl. 16:23.
Citera
2017-12-09, 17:48
  #7025
Moderator
Protons avatar
Citat:
Ursprungligen postat av ozyrecon
Tjena, jag leker lite med Binary Heap men har fastnat lite i tankeverksamheten. Jag har med hjälp av tutorials lyckats skapa och fylla denna Heapen med rätt siffror.

Arrayen är tänkt att se ut såhär när den linjära lösningen är implementerad.

Värde: 1, 3, 2,12, 6,4, 8, 15,14,9, 7, 5, 11, 13, 10

Plats: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14






Koden ser ut enligt följande och något säger mig att lösningen är enkel men jag kan inte komma på någon lösning.


Kod:
public class Main {

    public static void main(String[] args) throws IOException {
        //10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7, 4, 11, 13, 2

        BinaryHeap bh = new BinaryHeap(15);

        bh.insert(10);
        bh.insert(12);
        bh.insert(1);
        bh.insert(14);
        bh.insert(6);
        bh.insert(5);
        bh.insert(8);
        bh.insert(15);
        bh.insert(3);
        bh.insert(9);
        bh.insert(7);
        bh.insert(4);
        bh.insert(11);
        bh.insert(13);
        bh.insert(2);


        //System.out.println(bh.deleteMin());
        //System.out.println(bh.isFull());
        //System.out.println("Empty status = "+ bh.isEmpty());
        //bh.makeEmpty();
        bh.printHeap();
        System.out.println(bh.findMin());


    }
}




/** Class BinaryHeap **/
class BinaryHeap
{
    /** The number of children each node has **/
    private static final int d = 2;
    private int heapSize;
    private int[] heap ;

    // Constructor **/
    public BinaryHeap(int capacity)
    {
        heapSize = 0;
        heap = new int[capacity + 1];

        Arrays.fill(heap, -1);
    }

    // Function to check if heap is empty **/
    public boolean isEmpty( )
    {
        return heapSize == 0;
    }

    // Check if heap is full
    public boolean isFull( )
    {
        return heapSize == heap.length;
    }

    /** Clear heap */
    public void makeEmpty( )
    {
        heapSize = 0;
    }

    /** Function to  get index parent of i **/
    private int parent(int i)
    {
        return (i - 1)/d;
    }

    /** Function to get index of k th child of i **/
    private int kthChild(int i, int k)
    {
        return d * i + k;
    }

    /** Function to insert element */
    public void insert(int x)
    {
        if (isFull( ) )
            throw new NoSuchElementException("Overflow Exception");
        /** Percolate up **/
        heap[heapSize++] = x;
        heapifyDown(heapSize - 1);
    }

    /** Function to find least element **/
    public int findMin( )
    {
        if (isEmpty() )
            throw new NoSuchElementException("Underflow Exception");
        return heap[0];
    }

    /** Function to delete min element **/
    public int deleteMin()
    {
        int keyItem = heap[0];
        delete(0);
        return keyItem;
    }

    /** Function to delete element at an index **/
    public int delete(int ind)
    {
        if (isEmpty() )
            throw new NoSuchElementException("Underflow Exception");
        int keyItem = heap[ind];
        heap[ind] = heap[heapSize - 1];
        heapSize--;
        heapifyDown(ind);
        return keyItem;
    }

    /** Function heapifyUp  **/
    private void heapifyUp(int childInd)
    {
        int tmp = heap[childInd];
        while (childInd > 0 && tmp < heap[parent(childInd)])
        {
            heap[childInd] = heap[ parent(childInd) ];
            childInd = parent(childInd);
        }
        heap[childInd] = tmp;
    }

    /** Function heapifyDown **/
    private void heapifyDown(int ind)
    {
        int child;
        int tmp = heap[ ind ];
        while (kthChild(ind, 1) < heapSize)
        {
            child = minChild(ind);
            if (heap[child] < tmp)
                heap[ind] = heap[child];
            else
                break;
            ind = child;
        }
        heap[ind] = tmp;
    }

    /** Function to get smallest child **/
    private int minChild(int ind)
    {
        int bestChild = kthChild(ind, 1);
        int k = 2;
        int pos = kthChild(ind, k);
        while ((k <= d) && (pos < heapSize))
        {
            if (heap[pos] < heap[bestChild])
                bestChild = pos;
            pos = kthChild(ind, k++);
        }
        return bestChild;
    }

    /** Function to print heap **/
    public void printHeap()
    {
        System.out.print("\nHeap = ");
        for (int i = 0; i < heapSize; i++)
            System.out.print(heap[i] +" ");
        System.out.println();
    }
}
Ett inlägg till i kategorin "det fungerar inte".

VAD fungerar inte?

Vad är resultatet av exekveringen nu och vad hade du förväntat dig. Kraschar programmet? Annat?

Framgår ingenstans i nuläget.
Citera
2017-12-10, 16:51
  #7026
Medlem
ozyrecons avatar
Citat:
Ursprungligen postat av Proton
Ett inlägg till i kategorin "det fungerar inte".

VAD fungerar inte?

Vad är resultatet av exekveringen nu och vad hade du förväntat dig. Kraschar programmet? Annat?

Framgår ingenstans i nuläget.


Inga krascher men som jag sa vill jag att Heapen blir linjär med inputen 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7, 4, 11, 13, 2. Jag har lagt upp vilka platser som ska ha vilket element. Det är den linjära insättningen av nummer i en Binarr Heap jag har problem med. Hoppas det framgick nu
Citera
2017-12-10, 16:57
  #7027
Medlem
Citat:
Ursprungligen postat av ozyrecon
Inga krascher men som jag sa vill jag att Heapen blir linjär med inputen 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7, 4, 11, 13, 2. Jag har lagt upp vilka platser som ska ha vilket element. Det är den linjära insättningen av nummer i en Binarr Heap jag har problem med. Hoppas det framgick nu
Jag förstår inte.
Du lägger till siffrorna: 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7, 4, 11, 13, 2
När du skriver ut heapen så blir output: 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7, 4, 11, 13, 2

Vad är det för output du förväntar dig?
Citera
2017-12-11, 00:21
  #7028
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av ozyrecon
Inga krascher men som jag sa vill jag att Heapen blir linjär med inputen 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7, 4, 11, 13, 2. Jag har lagt upp vilka platser som ska ha vilket element. Det är den linjära insättningen av nummer i en Binarr Heap jag har problem med. Hoppas det framgick nu
Fattar inte riktigt varför man ska ange någon storlek i konstruktorn? Som användares av din heap vill jag bara skapa den och mata den med innehåll.
Sedan verkar du ha onödigt många publika metoder i klassen. De viktigaste är add/insert och delete/extract, kanske också merge.
Varför behövs metoden public int delete(int ind)?
public void printHeap() kan göras mer användbar (och standardiserad) om du istället gör en override på public String toString().
Istället för att som nu fråga efter det k:te barnet är det väl smidigare att ha metoderna leftChild och rightchild? Och på vilket sätt blir det enklare av att ersätta siffran 2 i "familjerelationerna" med konstanten d?
Citera
2017-12-11, 12:40
  #7029
Medlem
Shawn92s avatar
Tjena!
Håller på med fråga 7:

https://imgur.com/a/cLxDq

Vet att inre klass fungerar som andra klasser med skillnaden att de har tillgång till yttre klassens instansvariabler och metoder och att de inte kan nås utifrån. Vet inte riktigt hur jag ska tänka här..
Citera
2017-12-11, 12:52
  #7030
Medlem
Citat:
Ursprungligen postat av Shawn92
Tjena!
Håller på med fråga 7:

https://imgur.com/a/cLxDq

Vet att inre klass fungerar som andra klasser med skillnaden att de har tillgång till yttre klassens instansvariabler och metoder och att de inte kan nås utifrån. Vet inte riktigt hur jag ska tänka här..
Starta en IDE och testa koden. Då ser du vad du behöver skriva.

Är Board paketet eller är det den yttre klassen?

I vilken klass ska Position läggas? Addressera via den yttre klassen.
__________________
Senast redigerad av e7andy 2017-12-11 kl. 12:57.
Citera
2017-12-11, 13:31
  #7031
Medlem
Shawn92s avatar
Hallå!

Undrar angående denna fråga:

https://imgur.com/a/HR1hZ

Den första har jag besvarat men den 2:a är jag rätt osäker på... vad gäller här egentligen?
Citera
2017-12-11, 13:38
  #7032
Medlem
Citat:
Ursprungligen postat av Shawn92
Hallå!

Undrar angående denna fråga:

https://imgur.com/a/HR1hZ

Den första har jag besvarat men den 2:a är jag rätt osäker på... vad gäller här egentligen?
En abstrakt metod har ingen implementation så den kan inte returnera något.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback