繁体   English   中英

这种方法的时间复杂度(大 O)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM