Skum uppgift i C#, representera flera int med en int.

Permalänk
Medlem

Skum uppgift i C#, representera flera int med en int.

Hej Swec!

Har lite labbar i skolan, har gjort alla delmoment och ett utav de två extramomenten, momentet lyder följande:

An even more compact representation (extra)
Imagine a situation where you know that a set will only ever contain values from a limited set of
possible values. Say that the set will only contain any of the values 7, 42, 99, 10004 or 4234998. In
this special case, the set could be represented very compactly as follows. Let the set be internally
represented by a single integer value. This single value is either 0, which means that the set is empty,
or it has 1s at different positions indicating what values are included in the set. Some examples:
00000: the set is empty.
00001: only 7 is included.
00010: only 42 is included.
00101: 99 and 7 are both included.
10111: all values except 10004 are included.
Write yet another implementation of IIntSet that uses this representation. Note that it is an error
to try to insert values other than 7, 42, etcetera, so Add() should throw an exception in such cases.

Jag har klurat på denna en längre stund och kan inte se något sätt att lösa detta på ett dynamiskt sätt utan att behöva spara varje tal som man tänkt sig att man ska få addera. Uppgiftens tanke är ju dock enligt starten att man bara ska representera talföljden med en integer och på det sättet spara datamängd, men hur vet man vilka siffror man får representera utan att spara dem lokalt och på så sätt redan ta upp minne för alla tänkbara siffror?

Vill inte att någon ska lösa uppgiften åt mig direkt men om någon vet hur man gör så får denne gärna ge en puff i rätt riktning

//2infinity

Permalänk

Inte hundra på detta men jag tänker mig att du får göra det binärt då du konverterar från den vanlig 1, 2, 4, 8, 16 till att då vara 7, 42, 99, 10004, 4234998 etc. Enligt nedan tabell där x är vad du sparar

7 = 00001 -> x = 1
42 = 00010 -> x= 2
99 och 7 = 00101 => x = 5
all except 10004 = 10111 => x = 23

Kika på klassen BitArray

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Ser intressant ut. Ska kolla mer på det, har tittat lite redan och ser ut som en möjlig lösning. Måste sova så får kolla mer imorrn. Tack för hjälpen!

Permalänk
Skrivet av 2infinity:

Ser intressant ut. Ska kolla mer på det, har tittat lite redan och ser ut som en möjlig lösning. Måste sova så får kolla mer imorrn. Tack för hjälpen!

En annan lösning är ju att du har en int som lägger till 1 ifall man lägger till 7 så ska den lägga till 1 till integetern. Lägger man till typ 42 så kan den lägga till 10. Dvs 42+7 skulle ge 10+1=11.
Så 4234998 motsvarar att du lägger till 10000.

Kan även vara en lösning. Troligen enklare att implementera men kräver större tal

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Tack för hjälpen, körde med BitArray med bool värden. Jag lät också klassen ta in en list med vilka de tillåtna värdena är, vilket gör att man kan skicka in samma list till flera klasser av samma sort, så att de bara har en referens till den listan. Tanken är då att minne sparas på det sättet. Detta fallerar dock om alla objekt av denna klass kör med olika tillåtna värden.