Zum Hauptinhalt springen
tsecurity.de LIVE
Echtzeit-Radar & Feeds
Alle RSS Feeds
👥 Community & Social
Sichere ProgrammierungTCP vs UDP: The Two Ways to Move Data, and Why Neither Is "Better"(21.09.2026 um 09:31 Uhr)
Sichere ProgrammierungBukan Sekadar Variabel, Tapi Nyawa dari Aplikasi Kamu! 🚀(21.09.2026 um 09:36 Uhr)
Sichere ProgrammierungAI voice agent for customer service: what stops callers hanging up?(21.09.2026 um 09:42 Uhr)
Sichere ProgrammierungReading a small model's confidence instead of its prose(21.09.2026 um 09:47 Uhr)
Sichere ProgrammierungTCP vs UDP: The Two Ways to Move Data, and Why Neither Is "Better"(21.09.2026 um 09:31 Uhr)
Sichere ProgrammierungBukan Sekadar Variabel, Tapi Nyawa dari Aplikasi Kamu! 🚀(21.09.2026 um 09:36 Uhr)
Sichere ProgrammierungAI voice agent for customer service: what stops callers hanging up?(21.09.2026 um 09:42 Uhr)
Sichere ProgrammierungReading a small model's confidence instead of its prose(21.09.2026 um 09:47 Uhr)
Intelligence View
⚡ tsecurity.de Intelligence

The Furones Algorithm

A n\sqrt{n}n​ -Approximation for Independent Sets: The Furones Algorithm Frank Vega Information Physics Institute, 840 W 67th St, Hialeah, FL 33012, USA [email protected] Introduction The Maximum Independent Set (MIS) …

0
↗ Quelle (dev.to)
Reagiere als Erste:r — dein Feedback zählt!




A


n\sqrt{n}n

-Approximation for Independent Sets: The Furones Algorithm



Frank Vega

Information Physics Institute, 840 W 67th St, Hialeah, FL 33012, USA

[email protected]





Introduction



The Maximum Independent Set (MIS) problem is a core problem in graph theory and computer science. Given an undirected graph

G=(V,E)G = (V, E)G=(V,E)

, where

VVV

is the set of vertices and

EEE

is the set of edges, an independent set is a subset

S⊆VS \subseteq VSV

such that no two vertices in

SSS

are adjacent (i.e., no edge exists between any pair of vertices in

SSS

). The objective is to find an independent set of maximum cardinality, denoted OPT, the size of the largest independent set in

GGG

.





Key Characteristics





  • NP-Hard: MIS is NP-hard for general graphs, implying no known polynomial-time algorithm solves it exactly unless P = NP.


  • Applications: Used in scheduling, network design, coding theory, and resource allocation, where selecting non-conflicting entities is essential.


  • Approximation Challenge: Achieving a good approximation ratio is difficult, with the best polynomial-time algorithms often yielding ratios like

    O(n/log⁡n)O(n / \log n)O(n/logn)

    or worse due to the problem’s complexity. An approximation algorithm for the Maximum Independent Set problem with an approximation factor of

    n\sqrt{n}n

    would imply P = NP. This is because the Maximum Independent Set problem is known to be NP-hard, and it is hard to approximate within a factor of

    n1−ϵn^{1-\epsilon }n1ϵ

    for any

    ϵ>0\epsilon >0ϵ>0

    unless P=NP





Algorithm Description



The algorithm computes an approximate independent set for an undirected graph using a NetworkX graph object. It handles both bipartite and non-bipartite graphs, using the bipartite nature of trees to iteratively refine a candidate set until it is independent, followed by a greedy extension for maximality. Below is the updated algorithm:




import networkx as nx

def find_independent_set(graph):
"""
Compute an approximate independent set for an undirected graph by transforming it into a chordal graph.

Args:
graph (nx.Graph): A NetworkX Graph object representing the input graph.

Returns:
set: A set of vertex indices representing the independent set.
Returns an empty set if the graph is empty or has no edges.
"""
def iset_bipartite(bipartite_graph):
# Initialize an empty set to store the independent set
independent_set = set()
# Iterate over each connected component in the bipartite graph
for component in nx.connected_components(bipartite_graph):
# Extract the subgraph for the current component
bipartite_subgraph = bipartite_graph.subgraph(component)
# Compute the maximum matching in the bipartite subgraph
maximum_matching = nx.bipartite.hopcroft_karp_matching(bipartite_subgraph)
# Derive the vertex cover from the maximum matching
component_vertex_cover = nx.bipartite.to_vertex_cover(bipartite_subgraph, maximum_matching)
# Add nodes not in the vertex cover to the independent set
independent_set.update(set(bipartite_subgraph.nodes()) - component_vertex_cover)
return independent_set

def is_independent_set(graph, independent_set):
"""
Verifies if a given set of vertices is a valid Independent Set for the graph.

Args:
graph (nx.Graph): The input graph.
independent_set (set): A set of vertices to check.

Returns:
bool: True if the set is a valid Independent Set, False otherwise.
"""
# Check if any edge has both endpoints in the independent set
for u, v in graph.edges():
if u in independent_set and v in independent_set:
return False
return True

# Validate input is a NetworkX graph
if not isinstance(graph, nx.Graph):
raise ValueError("Input must be an undirected NetworkX Graph.")

# Handle trivial cases
if graph.number_of_nodes() == 0 or graph.number_of_edges() == 0:
return set() # Empty graph or no edges means empty Independent Set

# Create a working copy of the graph to avoid modifying the original
working_graph = graph.copy()

# Clean the graph: remove self-loops since they're not valid in a simple graph
working_graph.remove_edges_from(list(nx.selfloop_edges(working_graph)))

# Initialize the isolates set with nodes of degree 0
isolates = set(nx.isolates(working_graph))

# Remove isolated nodes from the working graph
working_graph.remove_nodes_from(isolates)

# If the cleaned graph is empty, return the set of isolated nodes
if working_graph.number_of_nodes() == 0:
return isolates

# Check if the working graph is bipartite
if nx.bipartite.is_bipartite(working_graph):
# If bipartite, compute the independent set directly
approximate_independent_set = iset_bipartite(working_graph)

else:
# Start with all nodes as a candidate independent set
approximate_independent_set = set(working_graph.nodes())
# Iteratively refine the set until it is a valid independent set
while not is_independent_set(working_graph, approximate_independent_set):
# Create a maximum spanning tree from the current candidate set
bipartite_graph = nx.maximum_spanning_tree(working_graph.subgraph(approximate_independent_set))
# Compute an independent set for the spanning tree
approximate_independent_set = iset_bipartite(bipartite_graph)

# Greedily add nodes to maximize the independent set
for u in working_graph.nodes():
if is_independent_set(working_graph, approximate_independent_set.union({u})):
approximate_independent_set.add(u)

# Include isolated nodes in the final independent set
approximate_independent_set.update(isolates)
return approximate_independent_set









Algorithm Steps





  1. Input Validation: Checks if the input is a valid NetworkX graph and handles trivial cases (empty graph or no edges).


  2. Preprocessing: Removes self-loops and isolated nodes, storing isolates for the final set.


  3. Bipartite Case: If the graph is bipartite, computes the maximum independent set using Hopcroft-Karp matching and König’s theorem.


  4. Non-Bipartite Case:


    • Starts with all vertices as the candidate set.

    • Iteratively constructs a maximum spanning tree of the subgraph induced by the current set, computes its maximum independent set, and updates the candidate set until it is independent in the original graph.




  5. Greedy Extension: Adds vertices greedily to ensure the output is a maximal independent set.


  6. Output: Returns the independent set, including isolated nodes.






Why It Has a √n-Approximation Ratio



The algorithm achieves a √n-approximation ratio, meaning the size of the independent set it produces, |S|, satisfies |S| ≥ OPT / √n, or equivalently, OPT / |S| ≤ √n, where OPT is the size of the maximum independent set and n is the number of vertices.






Analysis





  • Mechanism: The algorithm iteratively refines a candidate set by constructing a maximum spanning tree (bipartite) and selecting its maximum independent set, which is at least ⌈|S_k| / 2⌉ for a set S_k. The loop stops when the set is independent in G, and the greedy step ensures maximality.


  • Worst-Case Graph:



    • Structure: A clique C of size n - √n + 1, an independent set I of size √n - 1, with all vertices in I adjacent to all in C.


    • OPT: The maximum independent set is I, so OPT = √n - 1 ≈ √n, as including a vertex from C excludes all of I.


    • Algorithm Behavior:

    • Starts with S_0 = V, |S_0| = n.

    • Iterations may select a star tree centered in C, reducing the set size by 1 per iteration (e.g., S_1 = V \ {center}, |S_1| = n - 1).

    • Continues until possibly |S| = 1 (a single vertex in C), as the greedy step adds no vertices due to high connectivity.

    • Ratio: OPT / |S| = (√n - 1) / 1 ≈ √n.








  • Tightness: This graph demonstrates the ratio reaches ≈ √n in the worst case. In bipartite graphs, the algorithm finds OPT exactly, but the worst-case ratio is √n.







Intuition



The √n ratio occurs because, in dense graphs with large cliques, the algorithm may reduce the candidate set to a small size (e.g., 1) before achieving independence, and the greedy step cannot recover a large set due to the clique’s connectivity.






Runtime Analysis



With the optimized is_independent_set running in O(m), we analyze the time complexity, where n = |V| and m = |E|.





  • Input Validation: O(1).


  • Preprocessing:


    • Graph copy: O(n + m).

    • Self-loop removal: O(m).

    • Isolated nodes: O(n).








  • Bipartite Check: O(n + m).




  • Bipartite Case:



    • iset_bipartite:

    • Connected components: O(n + m).

    • Per component (total n vertices, m edges):


      • Subgraph extraction: O(n + m).

      • Hopcroft-Karp matching: O(√n · m).

      • Vertex cover: O(n).






    • Total: O(n + m + √n · m).








  • Non-Bipartite Case:



    • While Loop:


    • is_independent_set: O(m) per call, checking edges.

    • Maximum spanning tree: O(m log n) via Kruskal’s algorithm.


    • iset_bipartite on tree: O(n), as tree has < n edges.

    • Iterations: Up to O(n) in worst case (reducing by 1 per iteration).

    • Total: O(n · (m + m log n + n)) = O(n m log n).


    • Greedy Extension: O(n · m), as each of n vertices requires an O(m) check.








  • Overall: Dominated by non-bipartite case, O(n m log n). For dense graphs (m ≈ n²), this is O(n³ log n).







Summary





  • Time Complexity: O(n m log n).


  • Space Complexity: O(n + m) for graph and set storage.






Impact of the Algorithm






Strengths





  • Theoretical Breakthrough: This algorithm provides a strong evidence that P = NP.


  • Versatility: Optimal for bipartite graphs and handles general graphs with a guaranteed maximal independent set.


  • Practicality: Suitable for small-to-medium graphs in applications like scheduling or network partitioning.






Limitations





  • Approximation Ratio: The √n ratio is weak for large n (e.g., |S| = 1 when OPT = √n). Algorithms like greedy minimum-degree selection achieve O(n / log n).


  • Runtime: O(n m log n) is still costly for dense graphs (O(n³ log n)). Faster heuristics exist for large-scale problems.


  • Worst-Case Performance: Poor on graphs with large cliques connected to independent sets.






Practical Impact





  • Deployment: The tool is deployed via furones (available on PyPI), making it readily accessible for real-world applications.


  • Applications: Useful for quick approximations in scheduling, resource allocation, or network design where exact solutions are infeasible.


  • Scalability: Better suited for sparse graphs due to the m factor in the runtime. Dense graphs require faster alternatives.


  • Research: Serves as a teaching tool for approximation algorithms, illustrating trade-offs between simplicity and performance.






Future Improvements





  • Tree Selection: Heuristics for better spanning trees could reduce iterations.


  • Hybrid Methods: Combine with greedy or local search algorithms for better ratios.


  • Parallelization: Leverage parallel edge checks in is_independent_set for further speedup.



This algorithm, with the optimized subroutine, balances simplicity and improved runtime, but its √n-approximation ratio limits its use in applications requiring near-optimal solutions.

Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten The Furones Algorithm

Thematisch verwandte Begriffe: Furones, Algorithm · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Zum Aktualisieren ziehen
ZERO-DAY CVE-2026-94030 | A security vulnerability has been detected in SerenityOS up to 3d83e4509…
Advisory →
TTS Reader • tsecurity.de Voice
tsecurity.de Icon
tsecurity.de App
Offline-Lesen, Eilmeldungen & 0ms Ladezeit

Installiere tsecurity.de direkt auf deinen Home-Bildschirm für das ultimative Vollbild-Magazinerlebnis ohne Browser-Leisten.

Nächster Beitrag
Themen-Radar & Intelligence Matrix
Echtzeit-Taxonomie nach Angriffsvektoren & Plattformen

tsecurity.de Live Threat Radar

🔴 LIVE RADAR
MONITORING
AKTIV
CVE-DATENBANK
LIVE
🔍
Community Radar & Live Chat
Sentinel Bot online • Live-Stream
Dein Cluster: Security Explorer
Match:
lädt…
Verbindung zum Community-Stream wird aufgebaut...
Bearbeitungsmodus — Senden überschreibt deine Nachricht
Community-Puls — was gerade passiert
lädt…
Aktivitäten deiner Analysten
lädt…
Neues Thema oder Eilmeldung einreichen

Reiche interessante Links, Zero-Days oder Debatten ein. Die Community entscheidet per Upvote über die Veröffentlichung.

Heiß diskutierte Einreichungen
🔖 Gespeicherte Artikel
📂 Keine gespeicherten Artikel vorhanden.
Zurück Ziehen Vor
Links: vorheriger Artikel Rechts: nächster Artikel unten: schließen
News NIS-2 Frühwarnung Tier-1 Intel ⏱️ 3 Min vor 10 Min
Artikeldaten werden geladen...

Zurück: vorheriger Vor: nächster
↗ Original-Quelle
Social Reaktionen Deine Reaktion zählt
Einstufung & Relevanz-Poll 0 Stimmen
In sozialen Netzwerken teilen 1-Klick