lalo2302

lalo2302

Hi everyone.

I am working on a personal project where I need to represent a horizontal tree in a visual way for a user to interact with it, like shown at FIG. 1.

FIG. 1

I have thought about representing it as a list of lists as it usually goes, but I have this constraints:

  • I need to increase the depth of the tree at user request
  • The content of the new nodes (at depth expansion) depends solely on the leafs of the tree

To do this, I need to know the content of each leaf every time I want to increase its depth, and transversing the lists every time seems unnecessary and expensive. With other programming languages I could store the memory reference of each leaf at creation time, but with elixir this is not possible.

It came to my mind the possibility to make every node a process, having a “tree manager” that stores the PID of the root and the PIDs of each leaf. Leading to interact directly with the leafs at depth expansion without interacting with the rest of the nodes. But my lack of experience doesn’t let me know if this is unnecessary memory usage, seeing that a process uses 338 words when spawned, including a heap of 233 words compared with other data structures.

The tree is not very wide, but can increase its depth at user request. Maybe I can set a limit to change the root of the tree for one closer to the leafs every time the user passes it.

What do you guys think?

Showing Posts 1 to 8

OvermindDL1

OvermindDL1

I would just represent it as a map of maps, or if you really need efficiency with querying and such then perhaps a :graph (the BEAM comes with a graph module for graph data structures).

kokolegorille

kokolegorille

That might be a good use case to test neo4j.

lalo2302

lalo2302 OP

Any specifics of why maps rather than lists? My concern about this approach is that what’s in the middle of the tree doesn’t matter for the depth expansion, but I trust your advice. I may do a little demo to see it in action.

I am also checking the graph module, thank you very much!

lalo2302

lalo2302 OP

Really interesting, I enjoyed it. I am not interacting or querying the data the graph contains though. It is only for visualization of text information.

OvermindDL1

OvermindDL1

Easier to do positional lookup primarily, but there is also the idea that you could encode the path as keys and just flatten the whole tree into a single map (at which point if you need full speed then you could lift that into ETS itself later on). :slight_smile:

kokolegorille

kokolegorille

With FP You can use a [zipper](Zipper (data structure) - Wikipedia to traverse the tree.

@OvermindDL1 could explain what a zipper is much better than I might.

OvermindDL1

OvermindDL1

Hehe, I love zippers. Even in a flat encoding you can keep a special data structure to hold a fresh zipper to start iterations from if you need. ^.^

lalo2302

lalo2302 OP

Wow.

but there is also the idea that you could encode the path as keys and just flatten the whole tree into a single map

Didn’t thought about that, thank you a lot for the suggestion. At the beginning I was thinking on creating the tree first, and then transverse it to “draw” it on the browser with dot. But I could draw it on the go and at the same time save the tree as a flat map. So if the user wants to access a node, or expand the tree, I can access directly to its value on the map. :thumbsup:

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
psy-q
I’m trying to set up Emacs with elixir-ls via lsp-mode and credo via Flycheck. This should mostly be preconfigured as Flycheck picks up c...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews