On Saturday, October 1, 2016 at 1:17:48 PM UTC-4, Athul George Appadan 
wrote:
>
> I am trying to find a way to check the membership of a user defined type 
> object in a heap. This is the code I have written:
>
> type HeapEntry
>     k::Int
>     dist::Float64
> end
>
> isless(e1::HeapEntry, e2::HeapEntry) = e1.dist < e2.dist
>
> heap1 = []
> Collection.heappush!(heap1, HeapEntry(1, 10.0))
>
>
> But HeapEntry(1, 10.0) is returning false. Can anyone explain how to do it 
> correctly?
>

== defaults to object equality, so HeapEntry(1, 10.0) == HeapEntry(1, 10.0) 
returns false unless you define your own == operation.

However, I'm guessing that in this case you want to define an immutable 
type, rather than a mutable type.  Not only will storage etc be more 
efficient, but also the default == will do what you want in that case.

immutable HeapEntry

       k::Int

       dist::Float64

end

Base.isless(e1::HeapEntry, e2::HeapEntry) = e1.dist < e2.dist

heap1 = HeapEntry[]

Collections.heappush!(heap1, HeapEntry(1, 10.0))


At that point, HeapEntry(1, 10.0) in heap1 returns true.


However, note that a heap data structure is not designed for fast 
membership testing.  It is designed for quickly popping the minimum 
element.   If you want "x in data" operations to be fast, you should use 
some other data structure.

Reply via email to