¿Es el montón realmente un montón? [duplicar]

Posibles duplicados:
¿Por qué dos conceptos diferentes se denominan "montón"?
¿Cuál es la relación entre "un" montón y "el" montón?

En .NET (y Java hasta donde yo sé), el área donde los objetos se asignan dinámicamente se conoce como el montón administrado. Sin embargo, la mayora documentación que describe cómo funciona el montón administrado, lo describe como una estructura de datos lineal, como una lista o pila vinculada.

Entonces, ¿el montón administrado es realmente un montón, o se implementa con alguna otra estructura de datos? Si en realidad no usa una estructura de datos de pila, parece una falla significativa de la terminología sobrecargar el significado de esta palabra.

Si de hecho es una estructura de datos de pila, ¿cuál es el valor que satisface la propiedad de pila: el tamaño de la región de memoria asignada?

preguntado el 08 de enero de 11 a las 19:01

+1 Ya me he preguntado acerca de esta pregunta. -

4 Respuestas

No, el montón no es un árbol binomial ordenado por montones en absoluto. No está claro (para mí) de quién es la culpa del choque de terminología, pero ambos usos del montón se remontan a décadas atrás (parece que a mediados de 1970). Algo de la historia se discute en este artículo.

Respondido el 08 de enero de 11 a las 22:01

Posiblemente la palabra montón haya adquirido un significado propio más allá de la estructura de datos como terminología convencional. Quiero decir, ¿cómo lo llamaríamos y cómo lo enseñaríamos sin llamarlo "montón"? - John K

+1 para la referencia histórica de The Art of Computer Programming. - CARLOS LOTH

@John K: No soy un hablante nativo (de inglés), por lo que "heap" no significa mucho para mí, excepto por los dos usos inconexos en informática. IIUC, el uso convencional es sinónimo de "apilar". - Martin contra Löwis

En este sentido, "montón" significa: un área de memoria especial que se utiliza para almacenar recursos importantes. En ese contexto, no está relacionado con la "estructura de datos del montón".

Respondido el 08 de enero de 11 a las 22:01

Ciertamente no tengo el conocimiento histórico para comentar sobre esto con autoridad, pero creo que el término "montón", tal como se emplea para describir el mecanismo de asignación de memoria para objetos de mayor duración en .NET y Java, está más pensado como un evocador, palabra descriptiva, como esta gran masa de memoria desestructurada (desde el punto de vista del desarrollador) donde viven las cosas. En contraste, la "pila" evoca la imagen de una región de datos mucho más estructurada (de nuevo, desde el punto de vista del desarrollador): "dónde" las cosas viven en la pila se siente mucho más relevante que "dónde" viven en la pila.

Esto es claramente muy diferente del real estructura de datos del montón, que utiliza la palabra "montón" para referirse al llamado propiedad del montón (de Wikipedia):

si B es un nodo hijo de A, entonces clave (A) ≥ clave (B).

Así que sí, en realidad no están relacionados. Uno es solo un término descriptivo, mientras que el otro tiene una definición mucho más formal.

Respondido el 08 de enero de 11 a las 22:01

No estoy seguro de mi respuesta, pero hasta donde sé, en lenguajes como C # o Java, donde la memoria se administra, mi recolector de basura, la región de memoria no es lineal. El GC va liberando la memoria que puede liberar y cuando la memoria está baja la compacta haciendo algún tipo de desfragmentación. Mueve bloques de memoria que el programa usa para hacer algo de espacio en "el final". ¿Por qué necesitas esta respuesta? ¿Quieres hacer una gestión de memoria de bajo nivel?

Respondido el 08 de enero de 11 a las 22:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.