Given an array of hotel rooms and it's availability period (1 Jan to 6 Jan):
[
{
roomId: 101,
availability: [
{ roomId: 101, date: '2018-01-01' },
{ roomId: 101, date: '2018-01-02' },
{ roomId: 101, date: '2018-01-03' },
{ roomId: 101, date: '2018-01-05' },
{ roomId: 101, date: '2018-01-06' }
]
},
{
roomId: 102,
availability: [
{ roomId: 102, date: '2018-01-01' },
{ roomId: 102, date: '2018-01-03' },
{ roomId: 102, date: '2018-01-04' },
{ roomId: 102, date: '2018-01-05' }
]
},
{
roomId: 103,
availability: [
{ roomId: 103, date: '2018-01-02' },
{ roomId: 103, date: '2018-01-03' },
{ roomId: 103, date: '2018-01-06' }
]
},
{
roomId: 104,
availability: [
{ roomId: 104, date: '2018-01-04' },
{ roomId: 104, date: '2018-01-05' },
{ roomId: 104, date: '2018-01-06' }
]
},
{
roomId: 105,
availability: [
{ roomId: 105, date: '2018-01-01' },
{ roomId: 105, date: '2018-01-02' },
{ roomId: 105, date: '2018-01-04' },
{ roomId: 105, date: '2018-01-06' }
]
}
]
Table illustration of the availability above:
| | 1 Jan | 2 Jan | 3 Jan | 4 Jan | 5 Jan | 6 Jan |
| 101 | O | O | O | | O | O |
| 102 | O | | O | O | O | |
| 103 | | O | O | | | O |
| 104 | | | | O | O | O |
| 105 | O | O | | O | | O |
The expected result based on the input above is a final room with a grouped availability:
{
roomId: 101, // determined by the first object in the array
availability: [
{ roomId: 101, date: '2018-01-01' },
{ roomId: 101, date: '2018-01-02' },
{ roomId: 101, date: '2018-01-03' },
{ roomId: 104, date: '2018-01-04' },
{ roomId: 104, date: '2018-01-05' },
{ roomId: 104, date: '2018-01-06' }
]
}
Final grouping selection to be: 101 & 104
| | 1 Jan | 2 Jan | 3 Jan | 4 Jan | 5 Jan | 6 Jan |
| 101 | ✔️ | ✔️ | ✔️ | | O | O |
| 102 | O | | O | O | O | |
| 103 | | O | O | | | O |
| 104 | | | | ✔️ | ✔️ | ✔️ |
| 105 | O | O | | O | | O |
So how the final selection was determined is based on the least rooms move for the whole period of stay.
What is the most efficient search algorithm (in term of performance) of doing this in javascript? (Need to be efficient to keep processing really fast even with a long request of availability or more rooms grouping)
I'll put my algorithm in the answer section, but I don't think it is the most efficient way to do it. Please suggest if there is a better way!