国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

javascript - programmation, problèmes d'algorithme
PHP中文網
PHP中文網 2017-06-12 09:25:56
0
4
1056

J'ai eu une question d'entretien avant-hier
Veuillez utiliser des langages tels que js, python, java, c, c++ pour calculer 10 milliards de données en 10 secondes et les compléter (seulement dans les 3 secondes), même les nombres précèdent nombres impairs
Le format est le suivant
1, 2, 3, 4, 5
Le résultat de sortie est
2, 1, 4, 3, 6, 5,
Question 2 : Sur le code de 1, il faut que le mot clé for while ne peut pas être utilisé, à partir de 100 Récupérer tous les nombres premiers sur 100 millions (le temps ne peut pas dépasser 3 secondes)
Comment faire ?

PHP中文網
PHP中文網

認證高級PHP講師

répondre à tous(4)
我想大聲告訴你

Je ne comprends pas la première question. Cela signifie-t-il que 2 nombres forment une paire et que le nombre pair précède le nombre impair ?

La deuxième question est simple. Si vous ne pouvez pas utiliser de boucle, utilisez l'itération de tableau.

代言

En parlant de ?a phpforeach n’a pas d’importance (rires

Je pense que l'intention de l'intervieweur est de vous demander d'écrire une fonction récursive ? Eh bien, je suppose que oui.

Ty80

J'ai eu une question d'entretien avant-hier
Veuillez utiliser des langages tels que js, python, java, c, c++ pour calculer 10 milliards de données en 10 secondes, et complétez-les (seulement dans les 3 secondes), les nombres pairs viennent avant les nombres impairs
Le format est le suivant
1, 2, 3, 4, 5
Le résultat de sortie est
2, 1, 4, 3, 6, 5,
Question 2 : En plus du code en 1, il Il est nécessaire que le mot-clé for while ne puisse pas être utilisé, à partir de Obtenir tous les nombres premiers sur 10 milliards (le temps ne peut pas dépasser 3 secondes)
Comment faire ?


Puisqu'il ne peut pas être utilisé pendant un certain temps

Alors les performances récursives ne suffisent pas. . . Mais j'en utilise encore. . For Performance

Il existe peut-être un moyen astucieux

. . . 100億 La taille devrait être là. Je ne l'ai pas encore trouvé.

Code

10 milliards, c'est un peu gros, je vais d'abord en prendre 100 000

var n = 1000 * 1000; 
var test = new Array(n).fill(n).map((e, idx) => idx); 

De cette fa?on, vous pouvez obtenir un tableau de nombres naturels d'une longueur de 100 000.


Suivant

  1. Les nombres pairs en premier, les nombres impairs en dernier

Après observation, j'ai trouvé que 奇數 + 1、 偶數 - 1 allait bien

var isEven = n => n % 2 === 0; 

var res001 = test.map((e, idx) => {
    if (isEven(e)){
        return e - 1; 
    } else {
        return e + 1; 
    }
}); 

Répondez à la première question

Capture d'écran 1

Suivant

La question suivante est d'obtenir des nombres premiers basés sur ce qui précède, c'est-à-dire d'obtenir tous les nombres premiers de zs

J'ai recherché le problème des nombres premiers, et quelqu'un d'autre a dit 質數分布在 6 的倍數的左邊或者右邊 Ensuite, il me suffit de parcourir les c?tés gauche et droit de chaque multiple de 6 et de déterminer s'il s'agit de nombres premiers.

Lien?:?Déterminer si un nombre est un nombre premier/un nombre premier - de l'algorithme de jugement ordinaire à l'idée d'un algorithme de jugement efficace

// 剔除第一個負數 
var zs = res001.slice(1); 

var is6x = n => n % 6 === 0; 


var isPrime = n => {
     let temp = Math.sqrt(n);  
     
     for(let i = 2; i <= temp; i++){
         if(n % i === 0){
             return false; 
         }
     }
     
     return true;  
}  


var lasts = zs.filter(is6x).reduce((acc, cur) => {
    let left = cur - 1, right = cur + 1; 
    if (isPrime(left)) acc.push(left); 
    if (isPrime(right)) acc.push(right); 
    
    return acc; 
}, []); 

console.log(lasts); 

Capture d'écran deux

Je ne sais pas si c'est vrai...

Mais nous devons encore remettre les nombres premiers 1 2 3 5 de 小于 6 séparément. (Pas d'orthographe ici)

Performances

Respectez le code écrit ci-dessus

var isEven = n => n % 2 === 0; 


var is6x = n => n % 6 === 0; 

var isPrime = n => {
     let temp = Math.sqrt(n);  
     
     for(let i = 2; i <= temp; i++)
        if(n %i== 0){
            return false; 
        }
     return true;  
}  


function timeTest(n){
    var test = new Array(n).fill(n).map((e, idx) => idx); 
    var res001 = test.map((e, idx) => {
        if (isEven(e)){
            return e - 1; 
        } else {
            return e + 1; 
        }
    }); 
    var zs = res001.slice(1); 
    
    var lasts = zs.filter(is6x).reduce((acc, cur) => {
        let left = cur - 1, right = cur + 1; 
        if (isPrime(left)) acc.push(left); 
        if (isPrime(right)) acc.push(right); 
        
        return acc; 
    }, []); 
    
    return lasts; 
}

test

var n = 1000 * 10000; 

console.time('1000 萬')
timeTest(n); 
console.timeEnd('1000 萬');

1000 萬 Le résultat est tel que montré sur la photo


Cela a pris 13,8 secondes. Il est impossible de terminer le volume de 13.8 秒 不可能做到 10 + 3 秒內完成 100億 en 10 + 3 secondes.

Mon ordinateur est i5-4210M 12G Chrome 58

JavaScript ne peut pas atteindre cette performance?: JavaScript 做不到這樣的性能: 100億 個數字 13 nombres en 13 secondes....

Plusieurs G données...

Selon l'idée ci-dessus, même C/C++ on estime qu'il sera difficile d'exécuter 10 milliards en 13 secondes.

Concentrez-vous sur la résolution de problèmes.

Liens

Déterminez si un nombre est un nombre premier/un nombre premier - de l'algorithme de jugement ordinaire à l'idée d'un algorithme de jugement efficace

Ty80

Tout d'abord, merci pour l'algorithme de recherche de nombres premiers à l'étage, je posterai mes résultats et mon code (seulement 10 millions, 100 millions de navigateurs ont directement explosé, et la récursion ne peut pas être utilisée pour trouver des nombres premiers (résultats de mon test), sinon je dois exploser, je ne peux qu'itérer).

Résultats dans le navigateur?:

Le résultat dans

node?:

var arr = [];

console.time("1000萬");
for( var i = 1; i <= 10000000; i++ ){
    arr.push(i);
}

for( var j = 0, len = arr.length;j < len; j+=2 ){
    arr[j]++;
    arr[j+1]--;
}

function isPrime(num,sqrt){
     if(num == 1)
     return false;
     if(num == 2 || num == 3 )  
     return true;  
     if(num % 6 != 1 && num % 6 != 5)  
     return false;  
     var tmp = sqrt(num);  
     for(var i= 5;i<=tmp; i+=6 )  
        if(num % i == 0 || num % ( i + 2) == 0 )  
        return false ;  

     return true;  
};

function getPrime(sourceArray,array,isPrime,sqrt){

    sourceArray.map(function(num,idx){
        if(isPrime(num,sqrt)){
            array.push(num);
        }
    });

    return array;
};

var result = getPrime(arr,[],isPrime,Math.sqrt);

console.timeEnd("1000萬");
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal