nous avons deux bases de données de taille n contenant des nombres sans répétitions. Donc, au total, nous avons 2n éléments. Ils peuvent être accessibles via une requête à une base de données à la fois. La requête est telle que vous lui donnez un k et il renvoie kth plus petite entrée dans cette base de données. nous devons trouver la nième plus petite entrée parmi tous les 2n éléments dans les requêtes O (logn). l'idée est d'utiliser diviser pour régner mais j'ai besoin d'aide pour y réfléchir. Merci!nième plus petit nombre parmi deux bases de données de taille n chacune utilisant diviser et conquérir
Répondre
Voici comment j'ai pensé cela. Puisque c'est un problème d'éducation, je vous suggère d'arrêter de lire si l'un des points vous fait penser: «Ah, je n'y avais pas pensé, je peux penser plus loin dans ce sens tout seul».
1) Même observation que sdcwc: avec un léger problème éventuel à savoir s'il commence à 0 ou 1, la base de données peut être considérée comme une matrice triée. Je demande l'élément 0, je reçois le plus petit. Je demande 12, je reçois le 13 plus petit. Etc. Je trouve cela plus facile à visualiser.
2) Nous savons que nous recherchons un algorithme O (log n). Cela veut dire que grosso modo, nous sommes à la recherche d'une des deux choses:
Soit nous commençons par le calcul le plus petit élément, calculer alors le 2ème plus petit, plus petit 4, 8, etc., jusqu'à ce que nous sommes en à la taille que nous voulons, chaque étape dans le temps constant. Cela ne me semble pas prometteur. Ou nous partons d'un problème de taille n alors nous effectuons une opération à temps constant qui nous permet de résoudre le problème original en résolvant un problème de taille n/2.Évidemment, nous pouvons résoudre le problème pour n = 1 en temps constant, pour compléter l'algorithme. Cela semble un peu plus plausible.
En fait, il ne doit pas nécessairement être n/2 à chaque fois. Il pourrait être n/3, ou 999 * n/1000, et le résultat sera toujours O (log n). Mais il n'y a pas de mal à chercher n/2 en premier.
3) Comment allons-nous réduire le problème comme ça? Eh bien, si nous pouvons escompter/supprimer m éléments du début d'un tableau ou l'autre comme étant plus petit que le kth plus petit, alors nous pouvons trouver le (km) ème plus petit élément de la paire de tableaux résultante, et ce sera le kth plus petit des tableaux originaux. 4) Enfin, l'observation de percée est que si le mème plus petit élément du tableau A est plus petit que le mième plus petit élément du tableau B, alors ce mème élément de A ne peut pas être le (2m) plus petit élément du tableau deux tableaux combinés. Il est plus petit que cela (ou de valeur égale: je ne suis pas sûr si "aucune répétition" signifie "pas de répétitions dans chaque base de données", ou "pas de répétitions entre les bases de données combinées"), puisqu'il y a au maximum 2 * 1) éléments strictement plus petit que dans les deux tableaux combinés.
Sauf si j'ai fait une erreur, le reste est en train de coder. Avec un petit argument supplémentaire pour rendre compte de l'off-by-1 lorsque k est impair, cette solution est en fait O (log k), qui est O (log n) puisque k < = 2 * n.
J'ai vu ce problème lors d'un examen de qualification il n'y a pas si longtemps, et ça sent le problème des devoirs. Je vais donc faire seulement deux suggestions:
Etudiez la recherche binaire, en portant une attention particulière à la nature précise des invariants de boucle. Le livre de Jon Bentley Perles de programmation a une bonne explication
Essayez de généraliser les invariants pour la recherche binaire.
Dessiner une image avec divers cas particuliers:
- Chaque numéro dans DB1 est plus petit que tous les numéros dans DB2
- vice versa
- DB1 est égal à DB2
- Chaque numéro dans DB2 est deux fois le nombre correspondant dans DB1
Ceci est un problème assez difficile; vous aurez un temps plus facile si vous allez directement pour une preuve d'exactitude.
... * deux * suggestions? –
@Tom: Ce genre de chose est assez typique pour les professeurs. Au moment où un professeur a écrit deux suggestions, il a pensé à un troisième. Je pense que je vais le laisser :-) –
@Tom: deux suggestion: la peur et la surprise, et l'efficacité impitoyable. –
Conseils:
- Observez vos "bases de données" sont vraiment deux tableaux triés.
- Prenez les éléments du "milieu" des tableaux et comparez-les. Le résultat de la comparaison peut vous permettre d'exclure une partie.
- 1. nième plus petit élément d'un BST
- 2. Java Algo à Trouver le plus petit et le deuxième plus petit nombre dans la liste
- 3. Diviser une base de données de mol2 molécules en N ensembles plus petits
- 4. Nième racine de petit nombre renvoie un résultat inattendu dans C#
- 5. Comment diviser un fichier en n nombre de pièces
- 6. SubSonic 2.1 utilisant plusieurs bases de données
- 7. Troisième plus petit nombre dans les matrices et son ajout
- 8. La taille des bases de données MySQL et SQL Server
- 9. nginx_http_push_module et bases de données
- 10. Comment trouver le plus grand et le plus petit nombre dans un tableau en c
- 11. simple sélectionnez nième plus haut
- 12. trouver le k-ième élément le plus petit dans l'union de deux triées listes de taille m et n avec log d'efficacité (k)
- 13. Recherche du nième nombre premier en utilisant Python
- 14. identifier le plus petit nombre entier et le nombre de fois où il a été entré
- 15. fusion de deux tables de deux bases de données
- 16. ActiveRecord parle à deux bases de données?
- 17. Comment comparer deux bases de données?
- 18. Synchroniser deux bases de données SQL Server
- 19. connexion entre deux bases de données différentes
- 20. Expression régulière pour diviser "/ n"
- 21. Copie de données uniquement entre deux bases de données
- 22. Différence de données entre deux bases de données
- 23. Bases de données et DVCS
- 24. Stocker n-grammes dans la base de données dans <n nombre de tables
- 25. Plus petit nœud de quadtree de limitation
- 26. Multiplier et diviser par deux
- 27. Plus grand nombre parmi le nombre stocké dans un ensemble de variables
- 28. Comment trouver le plus petit intervalle contenant un ensemble de valeurs modulo N?
- 29. Nombre de lignes et utilisation de l'espace dans les bases de données CE sql
- 30. SQL Server - Synchronisation de deux bases de données
bien expliqué – user2290820