2-3-4 strom v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

2-3-4 strom v C – C / C++ – Fórum – Programujte.com2-3-4 strom v C – C / C++ – Fórum – Programujte.com

 

26. 4. 2013   #1
-
0
-

Dobrý den, 

za úkol mám naprogramovat 2-3-4 strom, vkládat postupně 100, 300, 1000, 3000, 10000, 30000, 100000 prvků a vypsat následující věci: 

- počet uložených čísel
- průměrný počet čísel uložených v jednom uzlu na 2 desetinná místa
- výšku stromu
- na 2 desetinná místa hodnotu:  výška_stromu / log2(počet_uložených_čísel)

Zde jsou pseudokody:

https://www.dropbox.com/s/94c2vlx8v1x533y/2-3-4.pdf

A zde můj výtvor:

// Alm_Zapocet_2-3-4-tree.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int pocet_uzlu = 0;
int static counter = 0;

double logaritmus2 (int n)
{

    double x;

    x=(log(double(n)))/(log(double(2)));
    return x;
}

typedef struct Node
{
	int order;
	int item[3];
	struct Node *child[4];
	
}Uzel;



Uzel *Create_Node (int x, Uzel * v, Uzel * w)
{
	Uzel *u = (Uzel*)malloc(sizeof(Uzel));

	pocet_uzlu++;

	u->order = 2;
	u->item[0] = x;
	u->child[0] = v;
	u->child[1] = w;
	u->child[2] = NULL;
    u->child[3] = NULL;

	return u;
}

Uzel * Split_Node (Uzel * u, Uzel * v)
{
	int i;

	if (v == NULL)
	{
		u->child[0] = Create_Node(u->item[0], u->child[0], u->child[1]);
		u->child[1] = Create_Node(u->item[2], u->child[2], u->child[3]);
		
		u->order = 2;
		u->item[0] = u->item[1];
		return u;
	}

	i = v->order - 1;

	while ((i > 0) && (u->item[1] < v->item[i-1]))
	{
		v->item[i] = v->item[i-1];
		v->child[i+1] = v->child[i];
		i--;
	}

	v->item[i] = u->item[1];
	v->child[i] = u;
	u->order = 2;
	v->child[i+1] = Create_Node(u->item[2], u->child[2], u->child[3]);
	//pocet_uzlu++;
	v->order = v->order + 1;
	return v;
}


bool Insert(Uzel **Tree, int x)
{
	Uzel *u = *Tree;
	

	int i, j;

	if (u == NULL)
	{
		*Tree = Create_Node(x, NULL, NULL);
		//pocet_uzlu++;
		return true;
	}

	Uzel *v = NULL;
	while (true)
	{
		if (u->order == 4)
		{
			u = Split_Node(u, v);
			
		}

		i = 0;

		while ((i < (u->order - 1)) && (x >= u->item[i]))
		{
			if (x == u->item[i])
			{
				return false;
			}

			i++;
		}

		if (u->child[i] != NULL)
		{
			v = u;
			u = u->child[i];
		}
		else
		{
			j = u->order - 1;

			while (j > i)
			{
				u->item[j] = u->item[j-1];
				j--;
			}

			u->item[i] = x;

			u->order = u->order + 1;
			return true;
				
		}
	}
}



void Inorder_Traversal (Uzel * Tree)
{
	int i;
	
	if (Tree == NULL)
	{
		return;
	}

	Inorder_Traversal(Tree->child[0]);

	i = 0;

	do
	{ 
		if ((counter < 200) || (counter > 18))
		{
			printf("%i ", Tree->item[i]);
			counter++;
			i++;
			Inorder_Traversal(Tree->child[i]);
		}
		else
		{
			i++;
			counter++;	
			Inorder_Traversal(Tree->child[i]);
		}
		
		
	} while (i < (Tree->order -1));
}

int Height (Uzel * koren)
{
	if (koren == NULL)
	{
		return -1;
	}
	else
	{
		return Height (koren->child[0]) + 1;
	}
}

void vystup (int n)
{
	int i;
	Uzel *Tree = NULL;


	for (i = 0; i <= n; i++)
	{
		Insert(&Tree, rand());
	}

	int vyska = Height(Tree);

	printf("|%6d |", n);
	printf(" %4.2f |", double(n)/double(pocet_uzlu));
	printf("%5d |",vyska);
	printf("%5.2f |", double(vyska)/logaritmus2(n));
	printf("\n");
	
}



int _tmain()
{
	printf("\n\t2-3-4 Tree - ALM2\n\n");
	printf("  Pocet  Prumer  Vyska  Podil\n");
    printf("------------------------------\n");

	vystup(100);

	vystup(300);

	vystup(1000);

	vystup(3000);

	vystup(10000);

	vystup(30000);

	vystup(50000);

	vystup(100000);
	printf("------------------------------\n");

	int i;
	Uzel * Tree = NULL;
	for (i = 0; i <= 20; i++)
	{
		Insert(&Tree, rand()%100);
	}

	Inorder_Traversal(Tree);

	

	system("pause");
	return 0;
}

Dole zkouším vložit 20 prvků do stromu, ale vypisuji mi to pouze 19 prvků. 

Předem děkuji za radu

Nahlásit jako SPAM
IP: 158.194.148.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

Podobná vlákna

B-strom — založil Siggi

Strom — založil DugButabi

Binarny strom — založil gogo0152

Binární strom — založil Michaela

Binární strom — založil garamond

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý