【不三不四的脑洞】《循环的代价》【算法悬疑短文】【Python】

0 阅读5分钟

《循环的代价》

——基于 Floyd 判圈算法的因果寓言


第一章:ρ\rho 的形状

在这里插入图片描述

警探李明盯着白板上的七张死者照片,手中的红笔停在半空。

这七起连环杀人案的现场,地面上都画着带有箭头的血线。当李明将所有现场的线条拼接在一起时,一个令他脊背发凉的拓扑结构出现了:

1.王强 → 2.赵敏 → 3.陈阳 → 4.张伟 → 5.刘芳
                      ↑             ↓
                    7.李娜 ← ← ← 6.孙浩

这不是一个圆,而是一个 ρ\rho”字形

“前两个死者(王强、赵敏)是直线,像一条尾巴。”李明喃喃自语,“从第三个死者(陈阳)开始,才进入了死循环。”

作为曾经的计算机系高材生,李明瞬间认出了这个结构——带环链表(Linked List with a Cycle)

凶手不是在随机杀人,他是在遍历一个数据结构


第二章:寻找入口 (Entry Point)

在这里插入图片描述

“为什么要这样排列?”助手小王不解,“如果是一个犯罪团伙,为什么不画成一个圈?”

“因为这是Floyd 判圈算法的应用。”李明眼神锐利,“在这个算法里,最关键的不是环里有多少人,而是找到**‘环的入口’(Entry Point)**。”

他指着3号死者陈阳的照片。

“你看,王强和赵敏是‘外部人员’,他们只是路径。而陈阳,是直线与圆环的交汇点。在数据结构中,他被称为入环节点。”

“这意味着,陈阳不是普通的参与者,他是将其他人拉入这个地狱循环的始作俑者。”

调查结果很快印证了李明的推测。 陈阳的加密云盘被破解,里面藏着一个名为“莫比乌斯”的地下虐猫组织名单:

  • 王强、赵敏:早期被邀请者,因胆怯试图退出,属于“边缘(Tail)”。
  • 陈阳创始人(Entry Point),制定了“循环虐杀”的规则。
  • 张伟至李娜:核心骨干,也就是“环(Cycle)”本身。

陈阳在日记里狂妄地写道:

“我们建立了一个完美的闭环。每个人都互相监督,没人能退出。只要没有开口,秘密就永远在内部循环。”

但他错了。在算法眼里,凡是环,皆可破。


第三章:算法的审判

在这里插入图片描述

在陈阳的尸体旁(他是最后被发现的,尽管他是链表中的第3个节点,这正是算法回溯的结果),警方发现了一段运行脚本。

凶手没有留下指纹,只留下了这段**“因果代码”**:

def justice_execution(head):
    # Phase 1: 判圈 (Detection)
    # 你们以为闭环是保护伞?
    # 不,快慢指针告诉我们:只要在环里,正义(慢)终将追上罪恶(快)。
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            break  # 罪行暴露,指针相遇
            
    # Phase 2: 找入口 (The Reveal)
    # 这就是为什么陈阳必须最后死。
    # 算法定理:从起点出发,与从相遇点出发,
    # 最终会在“环的入口”汇合。
    
    ptr_truth = head        # 真相从最初的受害者开始
    ptr_karma = slow        # 因果从暴露点开始
    
    while ptr_truth != ptr_karma:
        # 一步步逼近
        ptr_truth = ptr_truth.next
        ptr_karma = ptr_karma.next
        
    return ptr_truth # 找到了你:陈阳 (The Originator)

李明读懂了凶手的留言:

凶手先杀了外围的王强和赵敏(遍历Tail),然后进入核心圈,让核心成员在恐惧中通过互害暴露罪行(快慢指针相遇)。最后,当一切证据确凿,算法的逻辑精准地指向了陈阳

陈阳以为躲在中间最安全,但在数学上,所有指向环的路径,最终都会汇聚到入口。


尾声:死循环

在这里插入图片描述

案件结案,凶手依旧成谜,或许是某位极客,或许是某种天道意志。

在这里插入图片描述

李明在结案报告的末尾,写下了一段给所有潜在犯罪者的警示:

“虐待者常以为,只要构建一个封闭的圈子,罪恶就能被掩盖。

Floyd 算法 揭示了因果的三个铁律:

  1. 必然相遇:无论你跑得多快(快指针),良知与报应(慢指针)总会在环中与你重逢。
  2. 溯源定位:无论你把入口藏得这多深,数学公式都能精准找到罪恶的源头。
  3. 无法逃离:链表一旦成环,若无外力打破,节点将永远困在其中。

当你凝视深渊构建循环时,算法正在寻找你的入口。 一旦入环,便是死循环 (Infinite Loop)。


**`Program finished with exit code: JUSTICE.

完整 Python 代码

核心算法流程示意图在这里插入图片描述

class ListNode:
    def __init__(self, index, name, role):
        self.index = index
        self.name = name
        self.role = role
        self.next = None

def build_case_structure():
    """
    构建正确的 ρ 型链表
    """
    # 外围人员(非环部分)
    node0 = ListNode(0, "王强", "外围-被灭口")
    node1 = ListNode(1, "赵敏", "外围-被灭口")
    
    # 环的入口(始作俑者)
    node2 = ListNode(2, "陈阳", "核心-组织者")
    
    # 核心圈(环内部)
    node3 = ListNode(3, "张伟", "核心-技术")
    node4 = ListNode(4, "刘芳", "核心-财务")
    node5 = ListNode(5, "孙浩", "核心-场地")
    node6 = ListNode(6, "李娜", "核心-记录")
    
    # 构建链表
    node0.next = node1
    node1.next = node2  # 外围 → 核心入口
    node2.next = node3
    node3.next = node4
    node4.next = node5
    node5.next = node6
    node6.next = node2  # 闭环
    
    return node0
    
def justice_execution(head):
    # Phase 1: 判圈 (Detection)
    # 你们以为闭环是保护伞?
    # 不,快慢指针告诉我们:只要在环里,正义(慢)终将追上罪恶(快)。
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            break  # 罪行暴露,指针相遇
            
    # Phase 2: 找入口 (The Reveal)
    # 这就是为什么陈阳必须最后死。
    # 算法定理:从起点出发,与从相遇点出发,
    # 最终会在“环的入口”汇合。
    
    ptr_truth = head        # 真相从最初的受害者开始
    ptr_karma = slow        # 因果从暴露点开始
    
    while ptr_truth != ptr_karma:
        # 一步步逼近
        ptr_truth = ptr_truth.next
        ptr_karma = ptr_karma.next
        
    return ptr_truth # 找到了你:陈阳 (The Originator)


def analyze_case():
    """
    分析完整案件
    """
    head = build_case_structure()
    
    print("案件分析:")
    print("从第一个受害者(王强)开始追查...")
    print()
    
    # cycle_entry = detectCycle(head)
    cycle_entry = justice_execution(head)
    
    if cycle_entry:
        print(f"✓ Floyd 算法定位成功!")
        print(f"✓ 环的入口: {cycle_entry.name} (索引{cycle_entry.index})")
        print(f"✓ 身份: {cycle_entry.role}")
        print()
        print("结论:")
        print(f"  {cycle_entry.name} 是虐猫循环的真正始作俑者。")
        print(f"  他将偶发行为转变为系统性循环虐待。")
        print(f"  算法揭露了隐藏在环形结构中的关键人物!")
    
    return cycle_entry

# 运行分析
if __name__ == "__main__":
    analyze_case()