feat: add union-find-delete data structure

This commit is contained in:
Nemo D'ACREMONT 2025-04-18 19:51:51 +02:00
parent 8e2e802c9f
commit 4c3463d3fe
No known key found for this signature in database
GPG Key ID: 85F245EC3BB1E022
2 changed files with 96 additions and 0 deletions

61
src/utils/ufd.c Normal file
View File

@ -0,0 +1,61 @@
#include "ufd.h"
#include "stdlib.h"
#include <sys/queue.h>
struct ufd_t ufd__make_set(struct context_entry_t* thread)
{
struct ufd_children_t children = TAILQ_HEAD_INITIALIZER(children);
return (struct ufd_t) {
.thread = thread,
.parent = NULL,
.repr = NULL,
.children = children,
};
}
void ufd__init(struct ufd_t* ufd, struct context_entry_t* thread)
{
TAILQ_INIT(&ufd->children);
ufd->thread = thread;
ufd->repr = NULL,
ufd->parent = NULL;
}
void ufd__join(struct ufd_t* th1, struct ufd_t* th2)
{
struct ufd_t* a = ufd__find(th1);
struct ufd_t* b = ufd__find(th2);
if (a != b)
{
a->parent = b;
a->repr = b;
}
}
struct ufd_t* ufd__find(struct ufd_t* th)
{
if (th->parent == NULL)
return th;
// If parent is null, repr can't be null
if (th->repr->parent == NULL)
return th->repr;
struct ufd_t* nrepr = ufd__find(th->repr);
th->repr = nrepr;
return nrepr;
}
void ufd__delete(struct ufd_t* th)
{
struct ufd_t* child;
TAILQ_FOREACH(child, &th->children, link) {
child->parent = NULL;
}
}

35
src/utils/ufd.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef _UNION_FIND_H_
#define _UNION_FIND_H_
#include <sys/queue.h>
TAILQ_HEAD(ufd_children_t, ufd_t);
// union find delete data structure
struct ufd_t {
struct ufd_t* parent;
struct ufd_t* repr;
struct context_entry_t* thread;
struct ufd_children_t children;
TAILQ_ENTRY(ufd_t) link;
};
struct ufd_t ufd__make_set(struct context_entry_t* thread);
void ufd__init(struct ufd_t* ufd, struct context_entry_t* thread);
/*
* Join th1 set to th2 set
*/
void ufd__join(struct ufd_t* th1, struct ufd_t* th2);
/*
* Find th's representent
*/
struct ufd_t* ufd__find(struct ufd_t* th);
/*
* Deletes th from its set
*/
void ufd__delete(struct ufd_t* th);
#endif // _UNION_FIND_H_