Avatar billede mysitesolution Nybegynder
17. april 2007 - 19:06 Der er 11 kommentarer og
1 løsning

Algoritme problem - gruppering

Hej..

jeg vil gruppere nogle tal ind i nogle grupper.

fx 0,1,2,3,4,5,6,7,8,9,10,11,14

ind i

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

Til at finde ud af hvilke gruppe nummer de skal være i bruger jeg denne formel:

gruppeNummer = nummer / iAlt * kolonneAntal

den virker dog ikke når det er i "int"s da 0,8 jo bliver til 0, men den virker fint med "float"s.

"Ved" at det er muligt at lave i "int"s, og vil gerne have den ekstra ydelse :)
Avatar billede arne_v Ekspert
17. april 2007 - 20:40 #1
umiddelbart vil jeg da mene at

gruppenr = nummer / kolonneantal + 1

virker fint med dit eksempel
Avatar billede mysitesolution Nybegynder
17. april 2007 - 20:45 #2
nej der deler den 4 ud af gangen?
Avatar billede mysitesolution Nybegynder
17. april 2007 - 20:46 #3
0 / 3 = 0
1 / 3 = 0
2 / 3 = 0
3 / 3 = 1
4 / 3 = 1
5 / 3 = 1
6 / 3 = 2
Avatar billede arne_v Ekspert
17. april 2007 - 20:50 #4
0 / 5 + 1 = 1
...
4 / 5 + 1 = 1
5 / 5 + 1 = 2
...
9 / 5 + 1 = 2
10 / 5 + 1 = 3
...
14 / 5 + 1 = 3
Avatar billede mysitesolution Nybegynder
17. april 2007 - 20:53 #5
Jo men hvis der så er 13 tal så:

0 / 5 = 0
1 / 5 = 0
2 / 5 = 0
3 / 5 = 0
4 / 5 = 0
5 / 5 = 1
6 / 5 = 1
7 / 5 = 1
8 / 5 = 1
9 / 5 = 1
10 / 5 = 2
11 / 5 = 2
12 / 5 = 2

så bliver det ikke delt rigtigt. Nok ikke mig der har forklaret mig ordentligt. Men der må ikke være 5-5-3, så skal det være 5-4-4. Hermed hævet til 60
Avatar billede arne_v Ekspert
17. april 2007 - 21:09 #6
proev:

gruppenr = (int)(nummer * (antalraekker/(double)antalnumre) + 1);
Avatar billede mysitesolution Nybegynder
17. april 2007 - 21:14 #7
den har jeg også prøvet... men ville undgå at bruge floats og doubles, men er tilsyneladende svært :D
Avatar billede arne_v Ekspert
17. april 2007 - 21:50 #8
proev og kig paa g3 udregningen nedenfor:

using System;

namespace E
{
    public class MainClass
    {
        private const int COLS = 5;
        private const int ROWS = 3;
        private static void Test(int n)
        {
            for(int i = 0; i < n;i ++)
            {
                int g1 = i / COLS + 1;
                double f = ROWS/(double)n;
                int g2 = (int)(i * f + 1);
                int g3;
                int cut = COLS * ((n - 1) % ROWS + 1);
                if(i <= cut)
                {
                    g3 = i / COLS + 1;
                }
                else
                {
                    g3 = cut / COLS + (i - cut) / (COLS - 1) + 1;
                }
                Console.WriteLine(i + " " + g1 + " " + g2 + " " + g3);
            }
        }
        public static void Main(string[] args)
        {
            Test(13);
            Test(14);
            Test(15);
        }
    }
}
Avatar billede mysitesolution Nybegynder
17. april 2007 - 22:00 #9
items = 15;
                columns = 3;

                for (int i = columns - 1; i >= 0; i--)
                {
                    int minGrab = items / columns;
                    int to = items - minGrab;

                    for (int j = to; j < items; j++)
                        list[i].Add(j);

                    items -= minGrab;
                    columns--;
                }

ved at teste om den er hurtig...
Avatar billede mysitesolution Nybegynder
17. april 2007 - 22:01 #10
dog uden list ;)
Avatar billede mysitesolution Nybegynder
17. april 2007 - 22:17 #11
min nye tager 2,75 s for 10.000.000 gange, og med float er det 3,9 s

            HiPerfTimer timer = new HiPerfTimer();

            restart:

            int[] cells = new int[3];

            timer.Start();
            //0,35
            for (int gange = 0; gange < 10000000; gange++)
            {

                int columns = 3;
                int items = 13;

                for (int i = columns - 1; i >= 0; i--)
                {
                    int minGrab = items / columns;
                    int to = items - minGrab;

                    for (int j = to; j < items; j++)
                        cells[i] = j;

                    items -= minGrab;
                    columns--;
                }

                //for (int i = 0; i < items; i++)
                //    cells[(int)((float)i / (float)items * (float)columns)] = i;
            }

            timer.Stop();

            Console.WriteLine(timer.Duration);
            Console.WriteLine("Try again? [y/n]");

            if (Console.ReadKey().Key == ConsoleKey.Y)
                goto restart;
Avatar billede mysitesolution Nybegynder
26. marts 2008 - 21:39 #12
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester