diff --git a/quad_tree/cours.md b/quad_tree/cours.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9328fee6fb133004e342f416d80de7f82f2592fb 100644 --- a/quad_tree/cours.md +++ b/quad_tree/cours.md @@ -0,0 +1,16 @@ + + +```c +tree tree_compress(tree) +{ + if !is_leaf(tree) + { + tree->left = tree_compress(tree->left); + tree->right = tree_compress(tree->right); + if (tree->left == tree->right) + { + tree = tree->left; + } + } +} +``` \ No newline at end of file diff --git a/quad_tree/quad_tree.c b/quad_tree/quad_tree.c index 0463b765973e8f7b29662c2b9a80ac4328d69fa4..59d92cd447b796060ecc252a1f136a2ff79223e1 100644 --- a/quad_tree/quad_tree.c +++ b/quad_tree/quad_tree.c @@ -5,6 +5,7 @@ typedef int value_t; typedef struct node_ { value_t value; + value_t sqared_avg; node_ *child[4] } node_t; @@ -142,3 +143,51 @@ node_t *tree_vert_sym(node_t *tree) tree = fill_tree(m); return tree; } + +/** + * @brief Lossless tree compression + * + * @param tree + * @return node_t* + */ +void tree_lossless_compress(node_t *tree) +{ + if (!is_leaf(tree)) + { + for (int i = 0; i < 4; i++) + { + tree->child[i] = tree_lossless_compress(tree->child[i]); + } + if(last_branch(tree) + { + if (tree->child[0] == tree->child[1] == tree->child[2] == tree->child[3]) + { + tree->data = tree->child[0]->data; + free(tree->child); + } + } + } +} + +#define DIFF 4 + +standard_deviation = Racine de la moyenne des elements au carré + + void + tree__lossy_compression(node_t * tree) +{ + if (!is_leaf(tree)) + { + for (int i = 0; i < 4; i++) + { + tree->child[i] = tree_lossy_compress(tree->child[i]); + } + if (last_branch(tree)) + { + if (sqrt(tree->sqared_avg - tree->value * tree->value) < DIFF) + { + free(tree->child); + } + } + } +}