suchen
HeimBackend-EntwicklungPHP-Tutorial从N个数中选取最大的前10个[php版]_PHP教程

题目:

从N个数中选取最大的前10个, 有序输出.
N最大可能达到1000亿
每个数范围是0 - 2147483647
 
author: goosman.lei
mail: lgg860911@yahoo.com.cn
blog: http://blog.csdn.net/lgg201
 
php版测试结果:
输入100万条
总计[1000000]个输入
总计比较[2001653]次
总计写内存[552]次
总计耗时[1.742764s]
 
php版解决方案:
[php]  
define('DEBUG',                 FALSE);  
define('INFO',                  TRUE);  
$stderr = fopen('php://stderr', 'w+');  
$stdout = fopen('php://stdout', 'w+');  
$stdin  = fopen('php://stdin', 'r+');  
  
class PQueue {  
    public  $data;  
    public  $next   = NULL;  
    public function __construct($data) {  
        $this->data  = $data;  
    }  
    public static function factory($data, $n) {  
        $i      = -1;  
        $head   = NULL;  
        $prev   = NULL;  
        while ( ++ $i
            $node   = new PQueue($data);  
            if ( is_null($head) )   
                $head       = $node;  
            if ( !is_null($prev) )  
                $prev->next  = $node;  
            $prev   = $node;  
        }  
        return $head;  
    }  
    public static function dump($node, $n) {  
        global  $stderr, $stdout;  
        while ( !is_null($node) ) {  
            fprintf($n ? $stderr : $stdout, "%d\n", $node->data);  
            $node   = $node->next;  
        }  
        if ( $n ) fprintf($n ? $stderr : $stdout, "\n");  
    }  
}  
  
function generate_test_data($n) {  
    global  $stderr, $stdout;  
    srand(time());  
    for ( $i = 0; $i
        $r  = rand(0, 2147483647);  
        fprintf($stdout, "%d\n", $r);  
        fprintf($stderr, "%s", pack('l', $r));  
    }  
}  
  
function main($argc, $argv) {  
    global  $stderr, $stdout, $stdin;  
    if ( $argc
        printf("usage: \n\t1. 生成测试数据: %s /* 标准错误以二进制方式输出测试数据, 标准输出以文本方式输出测试数据用于脚本校验 */\n\t2. 执行Top 10查找: %s /* 标准输出输出前10个最大数据(倒序), 开启INFO时在标准错误输出统计信息, 开启DEBUG时在标准错误输出调试信息\n",   
                    $argv[0], $argv[0]);  
        exit(0);  
    }  
    if ( strcmp($argv[1], "exec") != 0 ) {  
        /* 不考虑数字输入的容错了 */  
        generate_test_data($argv[1]);  
        exit(0);  
    }  
  
    $sbuff  = NULL;  
    $rbuff  = PQueue::factory(-1, 10);  
  
if ( DEBUG ) {  
    PQueue::dump($rbuff, 1);  
}  
if ( INFO ) {  
    $s_0    = 0;  
    $s_1    = 0;  
    $s_2    = 0;  
    $begin  = microtime(TRUE);  
}  
    while ( FALSE != ($sbuff = fread($stdin, 1024 * 1024 * 4)) ) {  
        $sbuff  = unpack('l*', $sbuff);  
if ( INFO ) {  
    $s_2    += count($sbuff);  
}  
        foreach ( $sbuff as $d ) {  
if ( INFO ) {  
    $s_0 ++;  
}  
if ( DEBUG )  
    fprintf($stderr, "processing %d\n", $d);  
            $tmp    = &$rbuff;  
            while ( $tmp != NULL && $d >= $tmp->data ) {  
                $tmp    = &$tmp->next;  
if ( INFO ) {  
    $s_0 += 2;  
}  
            }  
if ( INFO ) {  
    $s_0 ++;  
}  
            if ( $tmp === $rbuff )  
                continue;  
if ( DEBUG )  
    fprintf($stderr, "tmp %d, rbuff %d\n", is_null($tmp) ? -1 : $tmp->data, $rbuff->data);  
if ( INFO ) {  
    $s_0 ++;  
    $s_1 ++;  
}  
            $rbuff->data = $d;  
            if ( $tmp != $rbuff->next ) {  
                $t          = $rbuff;  
                $rbuff      = $rbuff->next;  
                $t->next = is_null($tmp) ? NULL : $tmp;  
                $tmp        = $t;  
if ( INFO ) {  
    $s_1 += 4;  
    $s_0 ++;  
}  
            }  
        }  
if ( DEBUG )   
    PQueue::dump($rbuff, 1);  
    }  
if ( INFO ) {  
    $end    = microtime(TRUE);  
}  
    PQueue::dump($rbuff, 0);  
if ( INFO ) {  
    fprintf($stderr, "总计[%d]个输入\n总计比较[%d]次\n总计写内存[%d]次\n总计耗时[%0.6fs]\n",   
        $s_2, $s_0, $s_1, $end - $begin);  
}  
}  
main($argc, $argv);  
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477840.htmlTechArticle题目: 从N个数中选取最大的前10个, 有序输出. N最大可能达到1000亿 每个数范围是0 - 2147483647 author: goosman.lei mail: lgg860911@yahoo.com.cn blog: http:/...
Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Wie können Sie überprüfen, ob bereits eine PHP -Sitzung begonnen hat?Wie können Sie überprüfen, ob bereits eine PHP -Sitzung begonnen hat?Apr 30, 2025 am 12:20 AM

In PHP können Sie Session_Status () oder Session_id () verwenden, um zu überprüfen, ob die Sitzung gestartet wurde. 1) Verwenden Sie die Funktion Session_Status (). Wenn PHP_Session_Active zurückgegeben wird, wurde die Sitzung gestartet. 2) Verwenden Sie die Funktion Session_id (), wenn eine nicht leere Zeichenfolge zurückgegeben wird, die Sitzung gestartet wurde. Beide Methoden können den Sitzungszustand effektiv überprüfen, und die Auswahl der Verwendung von Methoden hängt von der PHP -Version und den persönlichen Einstellungen ab.

Beschreiben Sie ein Szenario, in dem die Verwendung von Sitzungen in einer Webanwendung unerlässlich ist.Beschreiben Sie ein Szenario, in dem die Verwendung von Sitzungen in einer Webanwendung unerlässlich ist.Apr 30, 2025 am 12:16 AM

SESSIONS AREVITALINWEBAPPLIKATIONEN, Besonders vor den Commerceplatformen

Wie können Sie den gleichzeitigen Sitzungszugriff in PHP verwalten?Wie können Sie den gleichzeitigen Sitzungszugriff in PHP verwalten?Apr 30, 2025 am 12:11 AM

Verwalten des gleichzeitigen Sitzungszugriffs in PHP kann mit den folgenden Methoden erfolgen: 1. Verwenden Sie die Datenbank, um Sitzungsdaten zu speichern, 2.. Diese Methoden tragen dazu bei, die Datenkonsistenz sicherzustellen und die Gleichzeitleistung zu verbessern.

Was sind die Einschränkungen bei der Verwendung von PHP -Sitzungen?Was sind die Einschränkungen bei der Verwendung von PHP -Sitzungen?Apr 30, 2025 am 12:04 AM

PhpSessionShaveseverallimitationen: 1) StorageConstraintScanleadtoperformanceISSues; 2) SecurityVulnerabilitieslikeSessionFixationAtpaSexist; 3) Skalierbarkeits-IschallengingDuetoServer-spezifisch; 4) SessionExpirationManbeproblematic;

Erklären Sie, wie sich das Lastausgleich auf das Sitzungsmanagement auswirkt und wie es angegangen werden soll.Erklären Sie, wie sich das Lastausgleich auf das Sitzungsmanagement auswirkt und wie es angegangen werden soll.Apr 29, 2025 am 12:42 AM

Lastausgleich beeinflusst das Sitzungsmanagement, kann jedoch durch Sitzungsreplikation, Sitzungsklebrigkeit und zentraler Sitzungsspeicher gelöst werden. 1. Sitzungsreplikationsdaten zwischen Servern. 2. Session Stickiness lenkt Benutzeranfragen auf denselben Server. 3. Zentraler Sitzungsspeicher verwendet unabhängige Server wie Redis, um Sitzungsdaten zu speichern, um die Datenfreigabe zu gewährleisten.

Erläutern Sie das Konzept der Sitzungsperrung.Erläutern Sie das Konzept der Sitzungsperrung.Apr 29, 2025 am 12:39 AM

SessionLockingIsatechniqueUTToensureUsers'SSessionSessionSeSexclusivetooneuseratatim.itiscrialtforpreventingDatacorruptionandSecurityBreachesinmulti-UserApplications

Gibt es Alternativen zu PHP -Sitzungen?Gibt es Alternativen zu PHP -Sitzungen?Apr 29, 2025 am 12:36 AM

Zu den Alternativen zu PHP-Sitzungen gehören Cookies, Token-basierte Authentifizierung, datenbankbasierte Sitzungen und Redis/Memcached. 1. Kookies verwalten Sitzungen, indem sie Daten über den Kunden speichern, was einfach, aber nur gering ist. 2. Altbasierte Authentifizierung verwendet Token, um Benutzer zu überprüfen, was sehr sicher ist, aber zusätzliche Logik erfordert. 3.Database-basiertssesses speichert Daten in der Datenbank, was eine gute Skalierbarkeit aufweist, die Leistung jedoch beeinflusst. V.

Definieren Sie den Begriff 'Sitzung' im Kontext von PHP.Definieren Sie den Begriff 'Sitzung' im Kontext von PHP.Apr 29, 2025 am 12:33 AM

Sessionhijacking bezieht sich auf einen Angreifer, der sich als Benutzer ausgibt, indem die SessionID des Benutzers angezeigt wird. Zu den Präventionsmethoden gehören: 1) Verschlüsseln der Kommunikation mit HTTPS; 2) Überprüfung der Quelle der SessionID; 3) mit einem sicheren Algorithmus zur Sitzung der Sitzung; 4) regelmäßig aktualisieren die SitzungID.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Leistungsstarke integrierte PHP-Entwicklungsumgebung