9
votes

C # Algorithme amélioré

On m'a demandé lors de l'interview (C # 3.0) pour fournir une logique pour supprimer une liste d'éléments d'une liste.

J'ai répondu xxx

1) le L'intervieweur a répondu que l'algorithme que j'avais employé prendra progressivement du temps si les articles grandissent et m'ont demandé de donner encore mieux et plus vite. Ce serait l'algorithme efficace?

2) Comment puis-je réaliser la même chose en utilisant Linq?

3) Il m'a demandé de fournir un exemple de fermeture à deux voies? (Général, je suis au courant de la fermeture, Quelle est la fermeture de deux voies?, répondis-je qu'il n'y a pas de mandat de ce type, mais il n'a pas fait satisfaire).


3 commentaires

Cela ressemble à l'entretien classique "Je suis plus intelligent que toi". Courir, ne pas marcher, loin de cet endroit.


Lol - pensait très bien la même chose, surtout en ce qui concerne "la fermeture à deux voies"? Un codeur aiguë essayant de prouver à son responsable (qui est probablement dans l'entretien) pourquoi il vaut son sel.


Jamais entendu parler d'une fermeture à deux sens. C # 2.0 a des fermetures mais elles ne sont nullement bidirectionnelles.


6 Réponses :


10
votes

Modifier meilleure solution: utilisez sauf qui n'est pas symétrique, contrairement à intersect .

1 & 2: Vous pouvez utiliser le intersect la méthode d'extension pour le faire. Cependant, si votre deuxième tableau contient des éléments non trouvés dans la première, ceux-ci seront alors dans la liste résultante: intersect fonctionne symétriquement.

Quant à la "fermeture bidirectionnelle", je n'ai jamais entendu parler de ce terme et je doute plutôt que c'est un terme technique établi.


0 commentaires

3
votes

Si vous n'utilisez pas sauf , et si vous souhaitez que votre solution soit à l'échelle des grandes listes, votre meilleur choix serait de trier la deuxième liste ou de faire une table de hachage, de sorte que pour Chaque élément de la première liste, vous pouvez facilement l'identifier dans la seconde. (C'est ainsi que sauf fonctionne, plus ou moins.)


0 commentaires

-1
votes

Je ne crois pas que le code que vous avez posté des œuvres. Un réseau standard n'a pas de méthode contenant. *

Ne tenant compte de cette question, peut-être que la question qu'il a vue avec votre réponse est que la méthode des éléments.Contains de votre exemple est exécutée pour chaque élément figurant dans la liste contenant des éléments à supprimer. En conséquence, cette liste est recherchée pour chaque élément de la liste complète des éléments.

Comme tout le monde l'a mentionné, l'utilisation de la méthode sauf serait plus efficace.

Edit: Vous n'avez pas vu que c # 3.0. Ma faute. Toujours une erreur de syntaxe entre les articles1 et les éléments.


2 commentaires

IEnumerable a une méthode d'extension contient définie dans C # 3.0+.


Brian, êtes-vous au courant des méthodes de vulgarisation? contient est une méthode d'extension de la classe énumérable appliquée à tous les ienumerable s, par conséquent pour les tableaux.



5
votes

Votre réponse est O (n ^ 2) car vous devez rechercher la petite liste pour chaque élément de la grande liste. Vous avez peut-être de la chance en utilisant une table de hachage ou une liste triée avec une recherche binaire (dans le cas d'entiers / chaînes) et d'autres manières de réduire les frais généraux de recherche, ce qui vous permettra au moins de vous. N).

À compter de la note, si la taille de la petite liste n'est pas similaire à la taille de la grande liste, votre solution est O (n * m); Vous voudriez d'abord optimiser la liste typiquement plus grande. Si vous pouvez trier la première liste, c'est un bon choix; Si vous n'êtes pas autorisé à le modifier, n'oubliez pas de trier / hachage la deuxième liste.


0 commentaires

5
votes

exemple en utilisant sauf xxx


0 commentaires

0
votes
int[] items1={1,2,3,4}; 
List<int> newList = new List<int>() { 1, 2, 3, 4, 5, 56, 788, 9 };
newList.RemoveAll((int i) => { return items.Contains(i); });

  1) The interviewer replied that the
  algorithm i have employed will
  gradually take time if the item grows
  and asked me to give even better and
  faster one.What would be the efficient
  algorithm ?
Your items1 has a length m, and newlist has a length n. Since you're performing a linear lookup on items1 for each item in newlist, your solution is O(n*m). From my point of view, your implementation is perfectly acceptable, and we probably shouldn't worry about optimizations until we need to.Evidently, however, its not good enough for the interview. Alright, what's "good enough" to the interviewer? Who knows. Now, if you don't mind taking some risks in your interview, you can challenge your interviewer to give more detail on the problem. Inform him that lots of factors and assumptions affect the speed of our code, especially the choice of data structure:
Assuming you require indexed access to newList, then converting items1 to a HashSet (which has O(1) lookup) improves your algorithm to the O(n) time required to rebuild the array.
Assuming newList is a "bag" of elements, meaning we don't care about the order of elements in the collection, then representing newList with a hashset allows us to remove m items in O(m) time.
Assuming we need to preserve the insertion order of elements in the collection, you can represent newList as a LinkedList{T}, while using a Dictionary{T, LinkedListNode} as a lookup table. When you add an item to the collection, you add it to the LinkedList, then add the newly created node to the dictionary. The LinkedList keeps the insertion order, and the Dictionary allows us to remove m items in O(m) time. However, we sacrifice indexed access to the collection.
Assuming newList keeps items in sorted order (doesn't appear to be the case with the sample code provided, but just humor me), most flavors of balanced binary trees will remove m items in O(m log n), they also support O(n) sorted-order traversal. Or if you're in right mood, a skip-list does the same job, only sillier.

  3) He asked me to provide an example
  for Two-Way-Closure? (General I am
  aware of closure, what is meant for
  Two-Way-Closure?, I replied i have
  ever heard that term,but he did not
  satisfy).
I've never heard of it either, and Google doesn't appear to turn up any relevant articles (apart from this thread, none of the results on the first 5 pages are programming or even computer related). The interviewer is an idiot.

0 commentaires