【问题标题】:How to `sort` strings depending on the output value of a program?如何根据程序的输出值对字符串进行“排序”?
【发布时间】:2023-03-14 02:00:01
【问题描述】:

我有包含许多字符串的文本文件,每行一个,需要排序。

我正在尝试使用sort 命令,但是它只能按字母或数字顺序排序,我需要更具体的东西。

是否可以使用外部程序来确定项目的顺序,例如sort --input=text.txt --evaluate=/bin/program

【问题讨论】:

    标签: sorting


    【解决方案1】:

    sort 或我知道的任何排序软件都不支持它。

    这实际上不可行,因为它太耗费资源而无法启动进程。根据需要启动数千个进程来比较数千对字符串,几乎会在短时间内冻结系统。

    分拣软件是如何工作的?

    考虑一个小文本:

    dog
    cat
    duck
    mouse
    ...
    

    排序需要比较键对。比如dog vs cat,然后dog vs duck,等等...来确定项目的相对顺序。根据算法和项目是否已经订购,需要在 NN*N 之间进行比较。

    在提供内置排序功能的编程语言中,开发人员必须提供一个比较器函数,如int comp(string first, string second),如果两个字符串分别按顺序返回-10+1,则等于或以相反的顺序。 (等号对于重复和稳定排序非常重要)。请参阅 Python sorted(..., key) 或 C++ std::sort(..., comp)

    理论上可以根据外部二进制/bin/compararator firstitem seconditem 和退出代码进行比较。 (忽略参数仅限于 ASCII 字符子集中的短字符串的问题)。

    它实际上太慢了,并且会在排序开始的那一刻冻结系统。它必须为(最多)每对字符串启动一个子进程。对于操作系统而言,启动进程是一项非常缓慢且非常密集的任务。

    启动进程有多慢?

    一个进程需要大约 10 到 100 毫秒来初始化,即使在最现代的最快 CPU 上也是如此。 对数千个字符串的小排序可能需要整整几分钟(数百万次比较),而正常的内存排序可以在几毫秒内完成。

    使用外部二进制文件进行比较是非常缓慢和低效的,尝试这样做没有任何意义。但它也会变得更糟,请耐心等待。

    进程创建是一项非常密集的任务,涉及操作系统和内核的深刻变化。系统将停止运行,几乎没有响应,而进程被无休止地创建。在这方面,它与只烧 CPU(例如使用while(1))不同,这无疑是“坏的” " 但不会显着影响其他正在运行的任务。

    如果开发人员必须实现工作池,创建一百个进程(或一千个线程)来完成一些工作。他们可能已经注意到,在创建池时,他们的桌面在几秒钟内冻结得非常糟糕。事实上,这太糟糕了,通常的做法是强睡眠以减轻系统负载for(n=0, n<100, n++) { startworker(); sleep(100ms); };。 (不用说,如果排序软件仅限于每秒进行几次比较,那么排序软件将永远无法完成)。

    供历史参考。在互联网初期运行 Web 应用程序的一种常见方式是CGI。一个简单的接口,在每个传入的 HTTP 请求上启动一个进程,使用标准输入/输出和环境变量来传递请求信息。它遇到了上述所有问题(速度慢、效率低和相关的 DDoS 问题),很快就不再使用了。不能很好地超过每秒几个请求。

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2021-11-09
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多