Skip to main content

Junction Linked List (JLI) - segmented structural data structure

Project description

Junction Linked List (JLI) — AMJ List

Stability. Structural Intelligence. Transparent Cost.


What Is JLI?

Junction Linked List (JLI), also known as the Anna Mani Junction List (AMJ List), is an in-memory, structurally driven ordered index built around a single guiding principle: the structure should carry all the information needed to stay efficient — not the workload.

JLI does not tune itself to access patterns. It does not rely on probabilistic balancing. Instead, it maintains explicit structural invariants that govern traversal, bound maintenance costs, and give you direct, real-time visibility into what the structure is doing and why.


About the Name

JLI is also referred to as the Anna Mani Junction List (AMJ List), named in tribute to Anna Mani (1918–2001), a pioneering Indian physicist and meteorologist.

In a newly independent India that depended on foreign meteorological instruments, Anna Mani took a harder path: she built reliable scientific instruments domestically, capable of operating under India's demanding and diverse conditions. Through her work at the India Meteorological Department, she standardized weather instruments for the entire country, later making foundational contributions to solar radiation measurement before renewable energy was a global concern.

Her legacy is one of structural self-reliance over dependence on external conditions — the same design ethos that defines this data structure.


Why JLI Exists

Most fast in-memory structures hide their true costs. Probabilistic structures promise strong averages but offer no structural guarantee on tail behavior, maintenance timing, or what happens when access patterns shift. Structures that rely on workload-specific tuning degrade when assumptions no longer hold.

These problems don't show up in microbenchmarks. They show up at scale, over time, under mixed or shifting workloads — precisely when reliability matters most.

JLI was built to address this directly.


Structural Design

JLI is built from three components:

Segments divide the list into fixed-size regions, bounding traversal and maintenance cost to local areas. Optimal segment size scales with sqrt(N).

Junctions sit at segment midpoints. Each junction stores segment metadata and participates in traversal as a normal node, providing O(N/S) coarse navigation without a separate index layer.

Shortcuts are regular nodes within a segment that additionally accelerate fine-grained traversal. They are placed at computed offsets — not randomly — and reduce the linear scan within a segment without adding a new structural tier.


Maintenance Model

JLI uses three levels of explicit, rate-limited maintenance:

Level Scope Trigger Purpose
Local Single segment Junction drifts > t_j from center Corrects drift in individual segments
Suboptimal Flagged segments Segment deviation exceeds soft_pct / hard_pct Targets structurally degraded regions
Global Full list Last resort: escalation gate or emergency ratio Emergency structural recovery

None of these run on every operation. They are triggered by structural conditions — not probabilistic thresholds — and their costs are fully exposed through the get_metrics() API. If a global rebuild fires, you will see it in the counter.


What JLI Actually Guarantees

These are the properties JLI is designed and empirically validated to provide:

1. Structural Invariants Are Maintained

JLI's invariants — segment size bounds, junction positioning, shortcut validity — are maintained continuously by the maintenance system. The structure does not silently degrade over time or under unusual key distributions. Maintenance is structural: it triggers on measurable drift, not on probability.

2. Maintenance Behavior Is Workload-Independent

The decision to maintain is driven by structural state, not by what operations are running. Across workloads from pure-delete to extreme insert floods, the maintenance scan rate stays within a narrow band. The structure maintains itself at roughly the same rhythm whether you're reading, writing, or doing both.

This does not mean latency is workload-independent — it is not. Latency is coupled to operation mix because search traversal and insert pressure have different raw costs. The invariant is about maintenance behavior, not about raw speed.

3. Long-Run Stability

p99 latency over a 300k-operation continuous run drifts by a mean of 1.28× — roughly 28% from first window to last, with exactly 1 global rebuild per seed. Worst-case observed drift across 4 seeds: 1.52×. The structure does not compound degradation over time and no runaway growth has been observed, but drift is real and should not be reported as zero.

4. Near-Flat Latency Scaling With N

p99 stays within a narrow absolute band as N grows. The log-log scaling exponent is −0.073 across N=5k–200k — meaning p99 actually decreases relative to N as the dataset grows. A 40× increase in dataset size produces p99 values that are lower at large N than small N. Most sorted structures degrade with N. This one does not.

5. Works Correctly Across All Dataset Sizes

JLI operates correctly and maintains its structural invariants across the full range of practical in-memory dataset sizes. Parameters scale with sqrt(N) and the structure adapts automatically. The practical lower bound is approximately N=5,000, below which constant overhead dominates.


Cost Model

Core Operations:

Operation Best Case Average / Worst Case
Search O(1) O(N/S + S)
Insert O(1) O(N/S + S)
Delete O(1) O(N/S + S)

S = segment size. At S ≈ sqrt(N), this reduces to O(sqrt(N)). Average and worst-case bounds are identical — traversal follows structural logic, not distributional assumptions.

Maintenance:

Level Cost
Local Rebuild O(r · S) per pass, r = rebuilt segments
Suboptimal Rebuild O(r · S) per pass, r = affected regions
Global Rebuild O(N) — last resort only

All maintenance costs are directly measurable via get_metrics().


Observability

JLI exposes a full set of read-only counters via get_metrics():

m = jli.get_metrics()
# {
#   "local_scan":   int,   # local drift scan events
#   "sub_scan":     int,   # suboptimal fragmentation scan events
#   "local_event":  int,   # local rebuild events
#   "sub_event":    int,   # suboptimal rebuild events
#   "global_event": int,   # global rebuild events
#   "local_cost":   int,   # nodes processed in local rebuilds
#   "sub_cost":     int,   # segments rebuilt in suboptimal passes
#   "global_cost":  int,   # nodes processed in global rebuilds
# }

These are direct counts of what the structure has done — not estimates or approximations.


Key Observed Properties

Latency scaling with N — p99 scales with a log-log exponent of −0.073 over the N=5k–200k range. A 40× dataset size increase produces p99 values that are lower at large N than small N. The structure gets proportionally cheaper as it grows — the opposite of most sorted structures.

Long-run p99 stability — over a 300k-operation continuous mixed workload, mean first-to-last window p99 drift is 1.28× (range: 1.16× to 1.52× across 4 seeds), with exactly 1 global rebuild per seed. No runaway growth observed.

Maintenance rate stability across workloads — the maintenance scan rate stays within a narrow absolute range across workload profiles spanning pure-delete to extreme insert floods. The maintenance decision is structural, not workload-driven.

Configuration robustness — the empirically tuned parameter set consistently outperforms alternative configurations by significant margins. Two hard limits are worth knowing: sub_interval set excessively high causes deferred maintenance to eventually fire as a large latency spike; local_interval below ~500 causes thrashing. Both are documented in the API reference.


Latency vs. Throughput

JLI carries an explicit maintenance overhead — this is by design and fully measurable. If your primary metric is peak raw throughput on a single operation type, a simpler structure will outperform it. If your primary metric is stable, predictable, observable behavior over long runtimes under mixed workloads, JLI is built for exactly that.


When to Use JLI

JLI is a strong fit when:

  • Workloads are mixed, unknown, or shift over time
  • Systems run continuously at high operation counts
  • Maintenance cost must be measurable and bounded, not hidden
  • Long-term latency stability is a correctness requirement
  • Dataset size changes over the lifetime of the system

JLI is not designed for:

  • Very small datasets (N < ~5,000) where constant overhead dominates
  • Random-access semantics — JLI is an ordered index, not a hash map or array
  • Single-operation benchmarks optimized for one workload type
  • Workloads that are overwhelmingly search-dominant

API Quick Reference

from JLI import JLI

# Initialize
jli = JLI(segment_size=175, shortcuts_per_junction=6)

# Load (most efficient path for initial data)
jli.build_from_values(sorted_keys)
jli.build_from_values(objects, key=lambda o: o["id"])

# Core operations
jli.insert(key)
jli.insert(key, payload=obj)
jli.delete(key)
node = jli.search(key)      # returns Node or None
jli.insert_many(keys)
jli.delete_many(keys)
jli.size()

# Observability
m = jli.get_metrics()       # full maintenance counter dict

Full API documentation: API_README.md


Who Built This

Mehal Chaudhary — computer science engineering student and independent researcher, 18. Interested in systems design where structure, performance, and long-term behavior intersect.

JLI reflects a focus on structural invariants, maintenance-aware systems, and predictable performance over time rather than short-lived optimizations.

Open to internships, research collaborations, and engineering roles where systems thinking and scalability reasoning are valued.


"If the ideas behind JLI resonate with you, the best way to evaluate it is to observe its behavior in your own workload."

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

junctionlinkedlist-0.1.0.tar.gz (26.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

junctionlinkedlist-0.1.0-py3-none-any.whl (23.0 kB view details)

Uploaded Python 3

File details

Details for the file junctionlinkedlist-0.1.0.tar.gz.

File metadata

  • Download URL: junctionlinkedlist-0.1.0.tar.gz
  • Upload date:
  • Size: 26.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for junctionlinkedlist-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8daf5caccc180cf235863f77c9f21b856cfab1125a2da5a498e5ba4be3f431d4
MD5 915a21d91323954fee7e9e1e76987c88
BLAKE2b-256 2a2a1b7e0b4a1e5dc5c7c6050b1b68b7a80b80084094ddd577936193dfd33d44

See more details on using hashes here.

File details

Details for the file junctionlinkedlist-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for junctionlinkedlist-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c78f12ce594e20e6221a7c559eed670cff6a47a4e96b1cb6875f5f8778bbf364
MD5 c6f7ffac6486c3f0cfce75dd46bf8326
BLAKE2b-256 3874f4da5b99fbe3dd976b834b239c25014b90aa25b063580ec0375ef889c4de

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page