[英]Time complexity in this method (Big O)
我一直在寻找这种方法的时间复杂度。 我认为不应该考虑对数据库的一些查询。 这里有没有人做这种事情的高手? 我曾尝试查看指南和视频,但其中大多数的示例都远不及这个大小,而且我必须承认我的数学真的很烂,所以当它超过两个时,我很难绕开它循环。 当您不考虑数据库时,它只是 O(n^3) 吗?
public List<HotelRoom> getSuitableHotelRooms(Date startDate, Date endDate, String roomType, int singleBedQty, int doubleBedQty) throws DataAccessException {
boolean isCandidate = true;
ArrayList<HotelRoom> correctTypeRooms = rctr.getFilteredHotelRooms(roomType, singleBedQty, doubleBedQty);
ArrayList<HotelRoom> suitableRooms = new ArrayList<HotelRoom>();
for(HotelRoom r : correctTypeRooms) {
List<Booking> bookingsOnRoom = getBookingsByRoomnumber(r.getRoomNumber());
if(bookingsOnRoom.isEmpty()) {
suitableRooms.add(r);
isCandidate = false;
}
else {
boolean isWhileCandidate = true;
while(isWhileCandidate) {
int noOfBookingsDone = 0;
for(Booking b : bookingsOnRoom) {
if(startDate.before(b.getTimeEnd().getTime()) && b.getTimeStart().getTime().before(endDate)) {
isCandidate = false;
isWhileCandidate = false;
}
else {
noOfBookingsDone++;
if(noOfBookingsDone>=bookingsOnRoom.size()) {
isWhileCandidate = false;
}
}
}
}
}
if(isCandidate) {
suitableRooms.add(r);
}
else {
isCandidate = true;
}
}
return suitableRooms;
}
private List<Booking> getBookingsByRoomnumber(int roomNumber) {
ArrayList<Booking> bookings = new ArrayList<>();
for(Booking b : this.allBookings) {
if(b.getR().getRoomNumber()==roomNumber) {
bookings.add(b);
}
}
return bookings;
}
public ArrayList<HotelRoom> getFilteredHotelRooms(String roomType, int singleBedQty, int doubleBedQty) throws DataAccessException {
ArrayList<HotelRoom> filteredRooms = new ArrayList<HotelRoom>();
try {
this.findHotelRoomByFilter.setString(1, roomType.toUpperCase());
this.findHotelRoomByFilter.setInt(2, singleBedQty);
this.findHotelRoomByFilter.setInt(3, doubleBedQty);
ResultSet rs = this.findHotelRoomByFilter.executeQuery();
while(rs.next()) {
HotelRoom r = new HotelRoom(rs.getInt("singleBedQty"), rs.getInt("doubleBedQty"), false, stringToEnum(rs.getString("roomType")));
r.setRoomNumber(rs.getInt("roomNumber"));
r.setPrice(rs.getDouble("price"));
filteredRooms.add(r);
}
} catch (SQLException e) {
throw new DataAccessException("Kunne ikke filtrere listen med hotelværelser", e);
}
return filteredRooms;
}
我假设您暗示方法getSuitableHotelRooms
的时间复杂度 - while
循环在这里没有意义:因为for(Booking b: bookingsOnRoom)
循环将准确运行bookingsOnRoom.size()
次并最终将isWhileCandidate
设置为 false, while
循环永远不会执行它的第二次迭代。 所以这里考虑两个for
循环,时间复杂度是O(correctTypeRooms_size * bookingsOnRoom_size)
(最好的情况是每个房间的bookingsOnRoom.isEmpty()
,在这种情况下时间复杂度变为O(correctTypeRooms_size)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.